Apa cara terbaik untuk menghapus semua subview dari Anda self.view?


87

Saya berpikir mungkin sesuatu seperti ini mungkin berhasil:

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

Saya ingin menghapus setiap jenis subview. UIImages, Buttons, Textfields dll.


1
Itu akan bekerja. Anda mungkin harus melakukannya secara rekursif jika Anda memiliki beberapa tingkatan subview ... atau mungkin tidak. Saya tidak yakin untuk apa Anda ingin melakukan ini.
Dustin

Itu bekerja? Saya pikir itu bakan segera dihapus dari subviewsarray, menyebabkan mutasi dalam loop enumerasi cepat, yang dilarang.
Mazyod

2
@Mazyod periksa properti subview: @property (nonatomic, readonly, copy) NSArray * subview - dideklarasikan sebagai copy, jadi ketika kita menghapus subview kita tidak memodifikasi array itu (karena itu adalah salinan).
Maks

1
@Max: Itu salah. The copyspecifier berarti bahwa hal itu membuat salinan ketika diatur ; tidak ada yang ditentukan tentang mendapatkan. Kemungkinan besar salinan dikembalikan, tetapi itu bukan bagian dari definisi properti.
jscs

@ W'rkncacnter setuju, Anda benar bahwa kata kunci copy tidak ada hubungannya dengan mendapatkan nilai (tapi saya pikir itu tersirat).
Maks

Jawaban:


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

Ini identik dengan varian Anda, tetapi sedikit lebih pendek.


Bagaimana dengan kecuali ini - menggunakan metode yang sama? @Mazyod
Hemang

Apakah ada perbedaan (berdasarkan kinerja) antara makeObjectsPerformSelector dan loop manual untuk menghapus subview?
Ganpat

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

Versi identik di Swift.


7

Cepat:

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

2

Anda bisa menggunakan seperti ini

//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 adalah tampilan yang ingin Anda hapus semuanya. Anda hanya menghapus setiap subview dengan melakukan forEach


Bisakah Anda memperluas jawaban Anda?
DᴀʀᴛʜVᴀᴅᴇʀ

Bukankah ini memutasi koleksi saat mengulanginya?
mixtly87

0

Untuk Swift 4 +. Anda dapat membuat ekstensi ke UIView. Sebut saja bila perlu.

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.