Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何在Swift中删除视图的所有子视图?_Macos_View_Swift - Fatal编程技术网

Macos 如何在Swift中删除视图的所有子视图?

Macos 如何在Swift中删除视图的所有子视图?,macos,view,swift,Macos,View,Swift,我正在寻找一种简单的方法,从superview中一次删除所有子视图,而不是逐个删除它们 //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) } 我错过了什么 更新 我的应用程序有一

我正在寻找一种简单的方法,从superview中一次删除所有子视图,而不是逐个删除它们

//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)
}
我错过了什么

更新

我的应用程序有一个主
容器视图
。我必须将不同的其他视图作为子视图添加到
container\u视图
,以便提供某种导航

因此,当单击按钮“打开”特定页面时,我需要删除所有子视图并添加新的子视图

更新2-工作解决方案(OS X)

我想苹果已经解决了

现在比以往任何时候都简单,只需拨打:

for view in containerView.subviews{
    view.removeFromSuperview()
}

你试过类似的东西吗

for o : AnyObject in self.subviews {
     if let v = o as? NSView {
         v.removeFromSuperview()
     }
}
试试这个:

for view in container_view.subviews {
    view.removeFromSuperview()
}

你的语法有点错误。确保您显式地强制转换

 let theSubviews : Array<NSView> = container_view.subviews as Array<NSView>
 for view in theSubviews {
     view.removeFromSuperview()
 }
让子视图:Array=container\u view.subview作为数组
用于在子视图中查看{
view.removeFromSuperview()视图
}

试试这个,我测试了这个:

  let theSubviews = container_view.subviews
  for subview in theSubviews {
      subview.removeFromSuperview()
  }
试试这个:

var subViews = parentView.subviews as Array<UIView>

      for someView in subViews
      {
          someView.removeFromSuperview()
      }
这样称呼它:

parentView.removeAllSubViews()

这应该是最简单的解决方案

let container_view: NSView = ...
container_view.subviews = []
(其他方法请参见)


注意这是一个MacOS问题,此答案仅适用于MacOS。它在iOS上不起作用。

编辑:(谢谢Jeremiah/Rollo)

到目前为止,在Swift for iOS中实现这一点的最佳方法是:

view.subviews.forEach({ $0.removeFromSuperview() }) // this gets things done
view.subviews.map({ $0.removeFromSuperview() }) // this returns modified array
^^这些功能很有趣

let funTimes = ["Awesome","Crazy","WTF"]
extension String { 
    func readIt() {
        print(self)
    }
}

funTimes.forEach({ $0.readIt() })
////结束编辑

只要这样做:

for view in self.view.subviews {
    view.removeFromSuperview()
}
或者,如果您正在寻找一个特定的类

for view:CustomViewClass! in self.view.subviews {
        if view.isKindOfClass(CustomViewClass) {
            view.doClassThing()
        }
    }

我不知道您是否设法解决了这个问题,但我最近遇到了一个类似的问题,For循环每次只留下一个视图。我发现这是因为调用removeFromSuperview()时self.subview发生了变异(可能)

为了解决这个问题,我做了:

let subViews: Array = self.subviews.copy()
for (var subview: NSView!) in subViews
{
    subview.removeFromSuperview()
}
通过执行.copy(),我可以在修改self.subviews数组的同时删除每个子视图。这是因为复制的数组(子视图)包含对对象的所有引用,并且不会发生变化

编辑:在您的情况下,我认为您会使用:

let theSubviews: Array = container_view.subviews.copy()
for (var view: NSView!) in theSubviews
{
    view.removeFromSuperview()
}

在xcodebeta6中,这个问题得到了解决

    var subViews = self.parentView.subviews
    for subview in subViews as [UIView]   {
        subview.removeFromSuperview()
    }

我写了这个扩展:

extension UIView {
    func lf_removeAllSubviews() {
        for view in self.subviews {
            view.removeFromSuperview()
        }
    }
}
这样您就可以在UIViewController中使用self.view.lf_removeallsubview。当我有更多的swift经验时,我会在稍后的swift版本中介绍这一点(到目前为止,我已经放弃了1天的经验,是的,对于API我也放弃了下划线)。

你必须试试这个

func clearAllScrollSubView ()
{
    let theSubviews = itemsScrollView.subviews

    for (var view) in theSubviews
    {

        if view is UIView
        {
            view.removeFromSuperview()
        }

    }
}

对于iOS/Swift,要删除我使用的所有子视图,请执行以下操作:

for v in view.subviews{
   v.removeFromSuperview()
}
要删除特定类(如UILabel)的所有子视图,我使用:


为了只删除特定类的子视图,这是在Xcode6.1.1中唯一适用于我的Swift代码。 假设您要删除的子视图的类型仅为UIButton

for subView in nameofmysuperview.subviews {
    if subView.isKindOfClass(UIButton) {
        subView.removeFromSuperview()
    }
}

“删除所有子视图”的扩展,可以快速删除

import Foundation
import UIKit

extension UIView {
    /// Remove allSubView in view
    func removeAllSubViews() {
        self.subviews.forEach({ $0.removeFromSuperview() })
    }

}

代码可以编写得更简单,如下所示

view.subviews.forEach { $0.removeFromSuperview() }
一艘班轮:
Swift 3

如果向视图中添加标记,则可以删除特定视图

for v in (view?.subviews)!
{
    if v.tag == 321
    {
         v.removeFromSuperview()
    }
 }
斯威夫特3

我这样做是因为仅仅从superview中删除并没有从数组中删除按钮

    for k in 0..<buttons.count {

      buttons[k].removeFromSuperview()

    }


    buttons.removeAll()

用于0中的k..用于
Swift 4.+

extension UIView {
     public func removeAllSubViews() {
          self.subviews.forEach({ $0.removeFromSuperview() })

}
我希望您能充分利用此功能。

Swift 5 我创建了两种不同的方法来删除子视图。如果我们把它们放在
扩展中

extension UIView {
    /// Remove all subview
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }

    /// Remove all subview with specific type
    func removeAllSubviews<T: UIView>(type: T.Type) {
        subviews
            .filter { $0.isMember(of: type) }
            .forEach { $0.removeFromSuperview() }
    }
}
扩展UIView{ ///删除所有子视图 func removeAllSubviews(){ subviews.forEach{$0.removeFromSuperview()} } ///删除具有特定类型的所有子视图 func removeallsubview(类型:T.type){ 子视图 .filter{$0.isMember(of:type)} .forEach{$0.removeFromSuperview()} } }
这里有另一种方法,允许您对
UIView
实例(或
UIView
子类)的任何集合调用该操作。这使得在
子视图
之后插入
过滤器
等内容变得很容易,因此您可以更具选择性,或者在其他
UIView
s集合中调用它

extension Array where Element: UIView {
  func removeEachFromSuperview() {
    forEach {
      $0.removeFromSuperview()
    }
  }
}
用法示例:

myView.subviews.removeEachFromSuperview()

// or, for example:

myView.subivews.filter { $0 is UIImageView }.removeEachFromSuperview()
myView.removeSubviews()
myView.removeSubviews { $0 is UIImageView }
或者,您也可以使用
UIView
扩展来完成相同的任务(尽管这不能在
UIView
实例的任意数组上调用):

用法示例:

myView.subviews.removeEachFromSuperview()

// or, for example:

myView.subivews.filter { $0 is UIImageView }.removeEachFromSuperview()
myView.removeSubviews()
myView.removeSubviews { $0 is UIImageView }


两件小事:我正在开发osx,所以它是对的?然后,我得到了“致命错误:数组索引超出范围”:/是的,我认为在OSX上是NSView。你从哪里得到致命错误?你确定你的父视图有子元素吗?是的!如果我做一个println(parentView.subview),我会得到1,这很奇怪!通常超出范围意味着您正在访问一个不存在的索引,通常我认为这是由于使用带有索引(如I++)的for循环造成的。@David是的,它会的,我试图使它尽可能接近FoxNos的初始代码。效果很好!ThanksHello,请尝试以下方法,尽管可能有一种更优雅的方法:
let subViewsArray:Array=(parentView.subviews as NSArray)。copy()as Array
这就是iOS。我需要一个用于OS X的解决方案IOS+1的伟大解决方案,它是UI而不是NS。这里我们讨论的是OS X。如果用NS取代UI也能用它工作,那我的错,你是对的:)这绝对是最简单的方法。。。对于不再在子视图数组中的每个视图,都会自动调用removeFromSuperview。@数据是的,它们不是,但是
NSView
(OS X)和
UIView
(iOS)之间有很大的区别。@Sulthan你说得对。我来这里是为了快速回答UIView的问题,但我没有阅读您的全部代码片段;)Swift 4给出错误:无法分配给属性:“子视图”是仅获取的属性:(@AmrAngry,我再说一遍,这始终是一个Mac OS问题,因为
NSView
,而不是iOS和
UIView
。只有人们不喜欢阅读问题和标签,因此它充满了iOS的答案。我想指出,@sulthan的答案,尽管被破布掩埋,却是最好的答案:@christorswasey Swift 4给出了一个答案错误:无法分配给属性:“子视图”是仅获取的属性。:(@WilliamT.Mallard)多少次
extension UIView {
    func removeSubviews(predicate: ((UIView) -> Bool)? = nil) 
        subviews.filter(
            predicate ?? { _ in true }
        ).forEach {
            $0.removeFromSuperview()
        }
    }
}
myView.removeSubviews()
myView.removeSubviews { $0 is UIImageView }