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.