วิธีใดที่ดีที่สุดในการลบมุมมองย่อยทั้งหมดออกจาก self.view ของคุณ


87

ฉันคิดว่าสิ่งนี้อาจใช้งานได้:

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

ฉันต้องการลบมุมมองย่อยทุกประเภท UIImages, ปุ่ม, Textfields ฯลฯ


1
ที่จะทำงาน คุณอาจต้องทำซ้ำหากคุณมีมุมมองย่อยหลายระดับ ... หรืออาจจะไม่มี ฉันไม่แน่ใจว่าคุณต้องการทำสิ่งนี้เพื่ออะไร
Dustin

ที่ได้ผล? ฉันคิดว่าbจะถูกลบออกจากsubviewsอาร์เรย์ทันทีทำให้เกิดการกลายพันธุ์ภายในลูปการแจงนับอย่างรวดเร็วซึ่งเป็นสิ่งต้องห้าม
Mazyod

2
@Mazyod ตรวจสอบคุณสมบัติ subviews: @property (nonatomic, readonly, copy) NSArray * subviews - มันถูกประกาศว่าเป็นสำเนาดังนั้นเมื่อเราลบมุมมองย่อยเราจะไม่แก้ไขอาร์เรย์นั้น (ทำให้เป็นสำเนา)
สูงสุด

1
@ แม็กซ์: ไม่ถูกต้อง copyระบุหมายถึงว่ามันทำให้สำเนาเมื่อตั้ง ; ไม่มีการระบุเกี่ยวกับการรับ มีความเป็นไปได้สูงมากที่จะส่งคืนสำเนา แต่นั่นไม่ใช่ส่วนหนึ่งของนิยามคุณสมบัติ
jscs

@ W'rkncacnter เห็นด้วยคุณพูดถูกแล้วที่ copy keyword ไม่มีส่วนเกี่ยวข้องกับ get value (แต่ฉันคิดว่าเป็นนัย ๆ )
สูงสุด

คำตอบ:


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

เหมือนกับตัวแปรของคุณ แต่สั้นกว่าเล็กน้อย


ยกเว้นสิ่งนี้ - ใช้วิธีการเดียวกันหรือไม่? @Mazyod
Hemang

มีความแตกต่าง (ตามประสิทธิภาพ) ระหว่าง makeObjectsPerformSelector และการวนซ้ำด้วยตนเองสำหรับการลบ subview หรือไม่
Ganpat



2

คุณสามารถใช้เช่นนี้

//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()
}

มุมมองคือมุมมองที่คุณต้องการลบทุกอย่างออก คุณแค่ลบทุก subview โดยทำ forEach


คุณสามารถขยายคำตอบของคุณได้หรือไม่?
DᴀʀᴛʜVᴀᴅᴇʀ

นี่ไม่ใช่การกลายพันธุ์ของคอลเลกชันในขณะที่ทำซ้ำ ๆ
mixtly87

0

สำหรับ Swift 4 + คุณสามารถขยายไปยังUIViewไฟล์. เรียกใช้เมื่อจำเป็น

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.