Saya mencari metode sederhana untuk menghapus sekaligus semua subview dari superview daripada menghapusnya satu per satu.
//I'm trying something like this, but is not working
let theSubviews : Array = container_view.subviews
for (view : NSView) in theSubviews {
view.removeFromSuperview(container_view)
}
Apa yang saya lewatkan?
MEMPERBARUI
Aplikasi saya memiliki utama container_view
. Saya harus menambahkan berbagai tampilan lain sebagai subview container_view
untuk menyediakan semacam navigasi.
Jadi, ketika mengklik tombol untuk "membuka" halaman tertentu, saya harus menghapus semua tampilan dan menambahkan yang baru.
UPDATE 2 - Solusi yang berfungsi (OS X)
Saya kira Apple memperbaikinya.
Sekarang lebih mudah dari sebelumnya, panggil saja:
for view in containerView.subviews{
view.removeFromSuperview()
}
Jawaban:
EDIT: (terima kasih Jeremiah / Rollo)
Sejauh ini cara terbaik untuk melakukan ini di Swift untuk iOS adalah:
^^ Fitur-fitur ini menyenangkan!
//// AKHIR EDIT
Lakukan saja ini:
Atau jika Anda mencari kelas tertentu
sumber
result of call to 'map' is unused
bukan kesalahan.Array.map
dalam kebanyakan bahasa akan mengembalikan array yang dimodifikasi. Metode yang setara yang tidak mengembalikan array, adalahview.subviews.forEach
.for view:CustomViewClass! in self.view.subviews where view.isKindOfClass(CustomViewClass) { view.doClassThing() }
Untuk iOS / Swift, untuk menyingkirkan semua subview yang saya gunakan:
untuk menghilangkan semua subview dari kelas tertentu (seperti UILabel) saya menggunakan:
sumber
Kode dapat ditulis lebih sederhana sebagai berikut.
sumber
Ini harus menjadi solusi paling sederhana.
(lihat Hapus semua subview? untuk metode lain)
Perhatikan ini adalah pertanyaan MacOS dan jawaban ini hanya berfungsi untuk MacOS . Itu tidak berfungsi di iOS.
sumber
NSView
(OS X) danUIView
(iOS).NSView
, bukan iOS danUIView
. Hanya orang yang tidak mau membaca pertanyaan dan tag karena itu dipenuhi dengan jawaban iOS.Saya tidak tahu apakah Anda berhasil menyelesaikan ini, tetapi saya baru-baru ini mengalami masalah serupa di mana loop For meninggalkan satu tampilan setiap kali. Saya menemukan ini karena self.subviews dimutasi (mungkin) ketika removeFromSuperview () dipanggil.
Untuk memperbaiki ini saya lakukan:
Dengan melakukan .copy (), saya bisa menghapus setiap subview sambil memutasikan array self.subviews. Ini karena array yang disalin (subViews) berisi semua referensi ke objek dan tidak bermutasi.
EDIT: Dalam kasus Anda, saya pikir Anda akan menggunakan:
sumber
let subViewsArray: Array = (parentView.subviews as NSArray).copy() as Array<NSView>
Coba ini:
sumber
Ekstensi untuk menghapus semua subview, itu dengan cepat dihapus.
sumber
Coba ini:
UPDATE : Jika Anda merasa ingin bertualang maka Anda dapat membuat ekstensi pada UIView seperti yang ditunjukkan di bawah ini:
Dan menyebutnya seperti ini:
sumber
Di xcodebeta6 ini berhasil.
sumber
Saya menulis ekstensi ini:
Sehingga Anda dapat menggunakan self.view.lf_removeAllSubviews dalam UIViewController. Saya akan meletakkan ini dalam versi cepat https://github.com/superarts/LFramework nanti, ketika saya memiliki lebih banyak pengalaman dalam swift (exp 1 hari sejauh ini, dan ya, untuk API saya menyerah garis bawah).
sumber
Cepat 3
Jika Anda menambahkan tag ke tampilan Anda, Anda dapat menghapus tampilan tertentu.
sumber
view.subviews.filter({$0.tag != 321}).forEach({$0.removeFromSuperview()})
?Cepat 5
Saya membuat 2 metode berbeda untuk menghapus subview. Dan itu jauh lebih mudah digunakan jika kita memasukkannya
extension
sumber
Sintaks Anda sedikit tidak aktif. Pastikan Anda melakukan casting secara eksplisit.
sumber
Anda harus mencoba ini
sumber
Untuk menghapus hanya subview dari kelas tertentu - ini adalah satu-satunya kode Swift yang berfungsi untuk saya di Xcode6.1.1. Dengan asumsi satu-satunya subview yang ingin Anda hapus adalah dari jenis UIButton ...
sumber
Satu-liner:
Saya pikir pendekatan ini lebih mudah dibaca daripada "one-liners" menggunakan peta atau forEach . Foreach tangan pendek dan peta bisa sulit dipahami, karena logikanya lebih abstrak.
sumber
Untuk Swift 3
Saya melakukan sebagai berikut karena hanya menghapus dari superview tidak menghapus tombol dari array.
sumber
Coba ini, saya menguji ini:
sumber
Untuk
Swift 4.+
Saya harap ini digunakan penuh untuk Anda.
sumber
apakah Anda mencoba sesuatu seperti
sumber