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.