从self.view中删除所有子视图的最佳方法是什么?


87

我在想也许这样的事情可能会起作用:

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

我想删除所有子视图。UIImages,按钮,文本字段等。


1
那可行。如果您有几层子视图,则可能需要递归地进行操作……也许没有。我不确定您要做什么。
达斯汀

那个有效?我认为b可以立即将其从subviews数组中删除,这会在快速枚举循环内引起突变,这是禁止的。
Mazyod

2
@Mazyod check subviews属性:@property(非原子,只读,副本)NSArray * subviews-声明为副本,因此在删除子视图时,我们不会修改该数组(因为它是副本)。
马克斯

1
@Max:不正确。该copy说明符的手段,它使一个副本时设置; 没有关于获取的任何规定。很可能返回一个副本,但这不是属性定义的一部分。
jscs 2012年

@ W'rkncacnter同意,您是对的,copy关键字与获取值无关(但是我认为这是隐含的)。
2012年

Answers:


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

与您的变体相同,但略短。


除此之外呢-使用相同的方法呢?@Mazyod
Hemang 2015年

makeObjectsPerformSelector和手动循环删除子视图之间有什么区别(按性能)?
Ganpat '18年

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

与Swift中的版本相同。


7

迅速:

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

1

你可以这样使用

//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是您要从中删除所有内容的视图。您只是通过forEach删除每个子视图


您能否扩大答案?
DᴀʀᴛʜVᴀᴅᴇʀ

这不是在迭代集合时对其进行变异吗?
mixtly87

0

对于Swift 4+。您可以扩展UIView。必要时调用它。

extension UIView {
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.