Який найкращий спосіб видалити всі підпрограми з вас self.view?


87

Я думав, можливо щось подібне може спрацювати:

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

Я хочу видалити всі види підпрограми. UIImages, кнопки, текстові поля тощо.


1
Це спрацює. Можливо, вам доведеться робити це якось рекурсивно, якщо у вас кілька рівнів підпрограми ... а може, ні. Я не впевнений, для чого ви хочете це зробити.
Дастін,

Це працює? Я думав, що bце буде негайно видалено з subviewsмасиву, що спричинить мутацію в циклі швидкого перерахування, що заборонено.
Mazyod

2
@Mazyod перевіряє властивість підзаглядів: @property (неатомний, лише для читання, копіювання) NSArray * підпрогляди - він оголошується як копія, тому, коли ми видаляємо підпрогляди, ми не змінюємо цей масив (оскільки це копія).
Макс

1
@Max: Це неправильно. Специфікатор copyозначає, що він робить копію, коли встановлений ; про отримання нічого не вказано. Цілком ймовірно, що копія повертається, але це не є частиною визначення властивості.
jscs

@ W'rkncacnter погодьтеся, ви праві, що ключове слово copy не має нічого спільного з get value (але, я думаю, це мається на увазі).
Макс

Відповіді:


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

Він ідентичний вашому варіанту, але трохи коротший.


Як щодо цього, крім цього - за допомогою того самого методу? @Mazyod
Hemang

Чи є якась різниця (за продуктивністю) між makeObjectsPerformSelector та циклом вручну для видалення підвиду?
Ganpat

22
self.view.subviews.forEach({ $0.removeFromSuperview() })

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


7

Стрімкий:

extension UIView {
    func removeAllSubviews() {
        for subview in subviews {
            subview.removeFromSuperview()
        }
    }
}

1

Можна використовувати так

//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.