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


87

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

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

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


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.



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() }
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.