【问题标题】:What is the best way to remove all subviews from you self.view?从 self.view 中删除所有子视图的最佳方法是什么?
【发布时间】:2012-08-07 00:32:27
【问题描述】:

我在想也许这样的事情可能会奏效:

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

我想删除所有类型的子视图。 UIImages、Buttons、Textfields等

【问题讨论】:

  • 那行得通。如果您有几层子视图,您可能必须递归地执行它......或者可能没有。我不确定你想这样做是为了什么。
  • 这行得通吗?我认为b 会立即从subviews 数组中删除,从而导致快速枚举循环中的突变,这是被禁止的。
  • @Mazyod 检查子视图属性:@property(nonatomic, readonly, copy) NSArray *subviews - 它被声明为副本,所以当我们删除子视图时我们不会修改该数组(因为它是一个副本)。
  • @Max:这是不正确的。 copy 说明符意味着它在设置时复制;没有具体说明获取。很可能会返回一个副本,但这不是属性定义的一部分。
  • @W'rkncacnter 同意,你说得对,copy 关键字与获取值无关(但我认为这是隐含的)。

标签: iphone objective-c ios uikit


【解决方案1】:
[self.view.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];

它与您的变体相同,但稍短一些。

【讨论】:

  • 除此之外怎么样——使用相同的方法? @Mazyod
  • makeObjectsPerformSelector 和手动循环删除子视图之间有什么区别(按性能)?
【解决方案2】:
self.view.subviews.forEach({ $0.removeFromSuperview() })

Swift 中的相同版本。

【讨论】:

    【解决方案3】:

    斯威夫特:

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

    【讨论】:

      【解决方案4】:

      你可以这样使用

      //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 删除每个子视图

      【讨论】:

      • 你能扩展你的答案吗?
      • 这不是在迭代集合时改变它吗?
      【解决方案5】:

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

      extension UIView {
          func removeAllSubviews() {
              subviews.forEach { $0.removeFromSuperview() }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        相关资源
        最近更新 更多