Kendi görüntünüzden tüm alt görünümleri kaldırmanın en iyi yolu nedir?


87

Belki böyle bir şeyin işe yarayacağını düşünüyordum:

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

Her türlü alt görünümü kaldırmak istiyorum. UIImages, Buttons, Textfields vb.


1
Bu çalışacaktır. Birkaç alt görünüm düzeyiniz varsa veya belki de yoksa, bunu yinelemeli olarak yapmanız gerekebilir. Bunu ne için yapmak istediğinden emin değilim.
— Dustin

Bu çalışır? Bunun diziden bderhal kaldırılacağını ve subviewshızlı bir numaralandırma döngüsü içinde yasak olan bir mutasyona neden olacağını düşündüm .
— Mazyod

2
@Mazyod check subviews özelliği: @property (nonatomic, readonly, copy) NSArray * subviews - kopya olarak bildirilir, bu nedenle alt görünümleri silerken bu diziyi değiştirmeyiz (çünkü bir kopya).
— Maksimum

1
@Max: Bu yanlış. copyBir kopyasını yapar belirteci aracı ayarladığınızda ; alma hakkında hiçbir şey belirtilmedi. Büyük olasılıkla bir kopya döndürülür, ancak bu özellik tanımının bir parçası değildir.
— jscs

@ W'rkncacnter katılıyorum, haklısınız, anahtar kelime kopyasının değer elde etmekle ilgisi yoktur (ama bunun ima edildiğini düşünüyorum).
— Maksimum

Yanıtlar:


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

Sizin varyantınızla aynı, ancak biraz daha kısadır.


Ya bunun dışında - aynı yöntemi kullanmak? @Mazyod
— Hemang

MakeObjectsPerformSelector ile alt görünümü kaldırmak için manuel döngü arasında (performansa göre) bir fark var mı?
— Ganpat

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

Swift ile aynı versiyon.


7

Swift:

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

2

Bunun gibi kullanabilirsin

//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()
}

görünüm, her şeyi kaldırmak istediğiniz görünümdür. forEach yaparak her alt görünümü kaldırıyorsunuz


Cevabınızı genişletebilir misiniz?
— DᴀʀᴛʜVᴀᴅᴇʀ

Bu, içinde yinelenirken bir koleksiyonu değiştirmiyor mu?
— mixtly87

0

Swift 4 + için bir uzantı yapabilirsiniz UIView. Gerektiğinde arayın.

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.