Swift удалить подвиды из супервизора

у меня есть scrollView, и я добавил к нему элемент управления обновлением.

self.refreshControl = UIRefreshControl()
self.refreshControl.attributedTitle = NSAttributedString(string: "Frissítéshez húzzad! :)")
self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
self.scrollView.addSubview(refreshControl)

в методе обновления я должен удалить все подвиды из прокрутки, а затем повторно заполнить прокрутку.

self.refreshControl = UIRefreshControl()
self.refreshControl.attributedTitle = NSAttributedString(string: "Frissítéshez húzzad! :)")
self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
self.scrollView.addSubview(refreshControl)

после того, как я попытаюсь вытащить, мой вид прокрутки получит новые данные, но у него больше нет элемента управления обновлением. Я думаю, это потому, что когда я удаляю подвиды из моего прокрутки, я также удаляю из него элемент управления обновлением. (если я снова добавлю refreshcontroll в свой метод обновления, у моего прокрутки снова будет refreshconroll) Но есть еще одна проблема. После обновления моего прокрутки вниз... я прикрепил к картинкам:

Вот как я удаляю subiews:

func refresh(sender:AnyObject)
{
    //remove all subviews from scrollview..
    let subViews = self.scrollView.subviews
    for subview in subViews{
        println("for removing...")
        subview.removeFromSuperview()
    }

    println("refresh called..")
    UIApplication.sharedApplication().applicationIconBadgeNumber = 0
    //remove all elements from the array
    tstFrames.removeAll(keepCapacity: false)
    //refresh data from webservice and adding it to tstFrames Array
    wsServiceFeedTst()
    //adding items to the scrollview from tstFramesArray
    addPosts()
    self.refreshControl.endRefreshing()

}

Вот как выглядит прокрутка перед обновлением: введите здесь описание изображения

Вот как это выглядит после обновления: введите здесь описание изображения

может ли кто-нибудь помочь мне о том, почему это движется вниз?

Благодарю вас!

Спасибо, это решение:

let subViews = self.scrollView.subviews
for subview in subViews{
    println("for removing...")
    if (subview is PostLineItem) {
        subview.removeFromSuperview()
    }
    else {
        println("not removing..")
    }
}

person solarenqu    schedule 14.06.2015    source источник
comment
Не могли бы вы опубликовать код, который вы используете для удаления подвидов?   -  person Lyndsey Scott    schedule 14.06.2015
comment
Я спрашиваю, потому что вы можете удалить как контроллер обновления, так и ограничения макета...   -  person Lyndsey Scott    schedule 14.06.2015
comment
спасибо! проверьте мой обновленный вопрос .. ограничения макета также являются подвидами? :)   -  person solarenqu    schedule 14.06.2015


Ответы (2)


Удалив все подпредставления, вы также можете удалить подпредставления, отличные от тех, которые вы явно добавили, например, представление обновления и ограничения макета.

(И чтобы ответить на ваш вопрос из комментариев, ограничения макета на самом деле могут быть подпредставлениями. Я объясню, как удалить все подпредставления, кроме ограничений макета, здесь: https://stackoverflow.com/a/27281242/2274694.)

В общем, я рекомендую изменить ваш код, чтобы он был более конкретным, чтобы удалялись только те представления, которые вы добавили. Например, вы можете добавить тег к подпредставлениям, которые вы добавляете в свой метод addPosts:

post.tag = 1000

затем удалите только подвиды с этим тегом в refresh::

let subViews = self.scrollView.subviews
for subview in subViews{
    if subview.tag == 1000 {
        subview.removeFromSuperview()
    }
}

чтобы убедиться, что вы не удаляете какие-либо подпредставления, которые вы явно не добавили сами.

Редактировать: оказывается, что все добавленные подпредставления OP имеют настраиваемый тип PostLineItem, поэтому теги не нужны, поскольку вместо этого мы можем просто удалить все PostLineItem:

for subview in self.view.subviews {
    if subview is PostLineItem {
        subview.removeFromSuperview()
     }
}
person Lyndsey Scott    schedule 14.06.2015
comment
let subViews = self.scrollView.subviews для подпредставления в subViews{ println(для удаления...) if (subview is PostLineItem) { subview.removeFromSuperview() } else {println(не удаление..) } } это решение! :) - person solarenqu; 14.06.2015
comment
@solarenqu Да, это даже лучше, поскольку все ваши добавленные подпредставления, по-видимому, относятся к типу PostLineItem. - person Lyndsey Scott; 14.06.2015
comment
@LyndseyScott Могу ли я создать UIView(), который будет добавлен в представление прокрутки, и все подпредставления будут добавлены в этот UIView, а затем, когда я захочу удалить все подпредставления, я могу просто удалить этот UIView? - person Joe Huang; 20.12.2015
comment
Спасибо за это! Я звонил view.removeFromSuperview(), и он не работал! Наконец, я просто перебрал все представления в подпредставлениях окна, нашел тег, который я установил, и удалил его. - person Jimbo; 08.12.2017

Сегодня я тоже столкнулся с этой проблемой и хотел бы поделиться своим решением. Вы можете удалить все подпредставления представления (и их подпредставления) с помощью следующего расширения UIView в swift. Кроме того, я приложил решение для снятия всех ограничений таким же образом.

extension UIView {

  // Recursive remove subviews and constraints
  func removeSubviews() {
    self.subviews.forEach({
        if !($0 is UILayoutSupport) {
            $0.removeSubviews()
            $0.removeFromSuperview()
        }
    })

  }

  // Recursive remove subviews and constraints
  func removeSubviewsAndConstraints() {
    self.subviews.forEach({
        $0.removeSubviewsAndConstraints()
        $0.removeConstraints($0.constraints)
        $0.removeFromSuperview()
    })
  }

}

Первое решение сохранит все ограничения, см. ответ Линдси. Имейте в виду, что это решение удаляет всю иерархию ниже UIView. Если вы хотите удалить только определенные подвиды обмена или расширения следующим образом:

if !($0 is UILayoutSupport) && !($0 is PostLineItem)
person masp    schedule 01.12.2016