Swift从超级视图删除子视图

问题描述:

我有一个scrollView,我添加了refreshcontroll它。Swift从超级视图删除子视图

self.refreshControl = UIRefreshControl() 
self.refreshControl.attributedTitle = NSAttributedString(string: "Frissítéshez húzzad! :)") 
self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged) 
self.scrollView.addSubview(refreshControl) 
在刷新方法我得从滚动视图中删除所有子视图,然后重新填充滚动型

..

self.refreshControl = UIRefreshControl() 
self.refreshControl.attributedTitle = NSAttributedString(string: "Frissítéshez húzzad! :)") 
self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged) 
self.scrollView.addSubview(refreshControl) 

后,我试图去拉,我的滚动视图获得新的数据,但它不再有更新控制。我认为这是因为当我从我的scrollview删除子视图我也从它删除refreshcontroll。 (如果我再次在我的刷新方法中添加refreshcontroll我的scrollview将再次有refreshconroll)但还有另一个问题。刷新我的滚动视图向下移动后..我连接到图片:

这是我如何删除subiews:

func refresh(sender:AnyObject) 
{ 
    //remove all subviews from scrollview.. 
    let subViews = self.scrollView.subviews 
    for subview in subViews{ 
     println("for removing...") 
     subview.removeFromSuperview() 
    } 

    println("refresh called..") 
    UIApplication.sharedApplication().applicationIconBadgeNumber = 0 
    //remove all elements from the array 
    tstFrames.removeAll(keepCapacity: false) 
    //refresh data from webservice and adding it to tstFrames Array 
    wsServiceFeedTst() 
    //adding items to the scrollview from tstFramesArray 
    addPosts() 
    self.refreshControl.endRefreshing() 

} 

这是怎么滚动视图看起来像清爽之前: enter image description here

的,这是清爽后的样子: enter image description here

有没有人可以帮我解释为什么会这样下去?

谢谢!

谢谢你,这是解决方案:

let subViews = self.scrollView.subviews 
for subview in subViews{ 
    println("for removing...") 
    if (subview is PostLineItem) { 
     subview.removeFromSuperview() 
    } 
    else { 
     println("not removing..") 
    } 
} 
+0

你可以发布你用来删除子视图的代码吗? –

+0

我在问,因为你可能会删除刷新控制器和布局限制... –

+0

谢谢!检查我更新的问题..是布局约束还子视图? :) – solarenqu

通过删除所有子视图,你也可以去除比你明确地添加的,如刷新视图和布局的制约等子视图。

(并回答评论你的问题,布局约束其实可以子视图我介绍了如何删除所有子视图除了布局约束此:https://*.com/a/27281242/2274694

在一般情况下,我建议改变你的代码更具体,只有你添加的观点被删除。例如,你可以一个标记添加到您在addPosts方法中添加子视图:

post.tag = 1000 

然后删除只与标签子视图中refresh:

let subViews = self.scrollView.subviews 
for subview in subViews{ 
    if subview.tag == 1000 { 
     subview.removeFromSuperview() 
    } 
} 

,以确保你不删除你自己没有明确添加的子视图。

编辑:原来,OP的添加子视图都是自定义类型PostLineItem,这样的标签是不必要的,因为我们可以只删除所有PostLineItem!而非:

for subview in self.view.subviews { 
    if subview is PostLineItem { 
     subview.removeFromSuperview() 
    } 
} 
+0

让子视图= self.scrollView.subviews 在子视图子视图{ 的println( “去除...”) 如果(子视图是PostLineItem){ subview.removeFromSuperview() } 其他{ 的println( “不删除..”) } }这是解决方案! :) – solarenqu

+0

@solarenqu是的,这更好,因为你添加的子视图显然都是'PostLineItem'类型。 –

+0

@LyndseyScott我可以创建一个UIView()添加到scrollview中,并将所有的子视图添加到这个UIView,然后当我想删除所有的子视图,我可以删除这个UIView? –

我偶然发现了今天这个问题,以及并希望分享我的解决方案。您可以在swift中使用以下UIView扩展名删除视图的所有子视图(及其子视图)。此外,我附加了一个解决方案,以同样的方式去除所有约束。

extension UIView { 

    // Recursive remove subviews and constraints 
    func removeSubviews() { 
    self.subviews.forEach({ 
     if !($0 is UILayoutSupport) { 
      $0.removeSubviews() 
      $0.removeFromSuperview() 
     } 
    }) 

    } 

    // Recursive remove subviews and constraints 
    func removeSubviewsAndConstraints() { 
    self.subviews.forEach({ 
     $0.removeSubviewsAndConstraints() 
     $0.removeConstraints($0.constraints) 
     $0.removeFromSuperview() 
    }) 
    } 

} 

第一个解决方案将保留所有约束上,看到Lyndseys答案。请注意,此解决方案将删除UIView下的整个层次结构。如果你只想删除特定的子视图交换或扩展像这样:

if !($0 is UILayoutSupport) && !($0 is PostLineItem)