Как лучше всего удалить все субвью из себя?

87

Я думал, может сработать что-то вроде этого:

    for (UIView* b in self.view.subviews)
    {
       [b removeFromSuperview];
    }

Я хочу удалить все виды подвидов. UIImages, кнопки, текстовые поля и т. Д.

dgund
источник
1
Это будет работать. Возможно, вам придется сделать это рекурсивно, если у вас есть несколько уровней вложенных представлений ... или, может быть, нет. Я не уверен, для чего вы хотите это сделать.
Дастин,
Это работает? Я думал, что bэто будет немедленно удалено из subviewsмассива, что вызовет мутацию в быстром цикле перебора, что запрещено.
Mazyod
2
@Mazyod проверяет свойство subviews: @property (неатомарный, только для чтения, копия) NSArray * subviews - он объявлен как копия, поэтому, когда мы удаляем вложенные представления, мы не изменяем этот массив (потому что это копия).
Макс,
1
@Max: Это неверно. Спецификатор copyозначает, что он делает копию, когда установлен ; о получении ничего не указано. Вполне вероятно, что будет возвращена копия, но это не часть определения свойства.
jscs 09
@ W'rkncacnter согласен, вы правы в том, что ключевое слово copy не имеет ничего общего с получением значения (но я думаю, что это подразумевается).
Макс,

Ответы:

250
[self.view.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];

Он идентичен вашему варианту, но немного короче.

Максимум
источник
Как насчет того, кроме этого - использования того же метода? @Mazyod
Hemang 01
Есть ли разница (по производительности) между makeObjectsPerformSelector и ручным циклом для удаления подпредставления?
Ganpat 08
22
self.view.subviews.forEach({ $0.removeFromSuperview() })

Идентичная версия в Swift.

lcl
источник
7

Swift:

extension UIView {
    func removeAllSubviews() {
        for subview in subviews {
            subview.removeFromSuperview()
        }
    }
}
миксель
источник
2

Вы можете использовать это так

//adding an object to the view
view.addSubView(UIButton())

// you can remove any UIControls you have added with this code
view.subviews.forEach { (item) in
     item.removeFromSuperview()
}

view - это представление, из которого вы хотите все удалить. вы просто удаляете каждое подпредставление, выполняя forEach

колючка
источник
Не могли бы вы расширить свой ответ?
DᴀʀᴛʜVᴀᴅᴇʀ
Разве это не изменяет коллекцию во время итерации по ней?
mixtly87
0

Для Swift 4+ можно сделать расширение UIView. Звоните при необходимости.

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
Ishwardgret
источник