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


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.