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.

dgund
sumber
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.

Max
sumber
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.

lcl
sumber
7

Cepat:

extension UIView {
    func removeAllSubviews() {
        for subview in subviews {
            subview.removeFromSuperview()
        }
    }
}
mixel
sumber
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

spikee
sumber
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() }
    }
}
ishwardgret
sumber