Cách tốt nhất để xóa tất cả lượt xem phụ khỏi bạn self.view là gì?


87

Tôi đã nghĩ có thể một cái gì đó như thế này có thể hoạt động:

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

Tôi muốn xóa mọi loại lượt xem phụ. UIImages, Buttons, Textfields, v.v.


1
Điều đó sẽ hoạt động. Bạn có thể phải làm điều đó một cách đệ quy nếu bạn có nhiều cấp lần xem phụ ... hoặc có thể không. Tôi không chắc bạn muốn làm điều này để làm gì.
Dustin

Điều đó hoạt động? Tôi nghĩ rằng điều đó bsẽ được xóa ngay lập tức khỏi subviewsmảng, gây ra đột biến trong vòng lặp liệt kê nhanh, điều này bị cấm.
Mazyod

2
@Mazyod kiểm tra thuộc tính subviews: @property (nonatomic, readonly, copy) NSArray * subviews - nó được khai báo là bản sao, vì vậy khi chúng tôi xóa các subviews, chúng tôi không sửa đổi mảng đó (vì nó là một bản sao).
Tối đa

1
@Max: Không chính xác. Bộ copychỉ định có nghĩa là nó tạo một bản sao khi được đặt ; không có gì được chỉ định về nhận được. Rất có thể một bản sao được trả lại, nhưng đó không phải là một phần của định nghĩa thuộc tính.
jscs

@ W'rkncacnter đồng ý, bạn nói đúng rằng từ khóa sao chép không liên quan gì đến nhận giá trị (nhưng tôi nghĩ nó được ngụ ý).
Tối đa

Câu trả lời:


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

Nó giống với biến thể của bạn, nhưng ngắn hơn một chút.


Điều gì về ngoại trừ điều này - sử dụng cùng một phương pháp? @Mazyod
Hemang

Có sự khác biệt nào (theo hiệu suất) giữa makeObjectsPerformSelector và vòng lặp thủ công để loại bỏ lượt xem phụ không?
Ganpat

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

Phiên bản giống hệt trong Swift.


7

Nhanh:

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

1

Bạn có thể sử dụng như thế này

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

chế độ xem là chế độ xem mà bạn muốn xóa mọi thứ khỏi đó. bạn chỉ xóa mọi lượt xem phụ bằng cách thực hiện forEach


Bạn có thể mở rộng câu trả lời của bạn?
DᴀʀᴛʜVᴀᴅᴇʀ

Đây không phải là biến đổi một bộ sưu tập trong khi lặp qua nó?
mixtly87

0

Đối với Swift 4 +, bạn có thể tạo một phần mở rộng cho UIView. Gọi nó bất cứ khi nào cần thiết.

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.