Swift从superview中删除子视图

sol*_*nqu 7 uiscrollview ios uirefreshcontrol swift

我有一个scrollView,我添加了一个refreshcontroll.

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)
Run Code Online (Sandbox Code Playgroud)

在刷新方法中,我必须从scrollview中删除所有子视图,然后重新填充scrollview ..

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)
Run Code Online (Sandbox Code Playgroud)

在我尝试拉动之后,我的滚动视图获得了新数据,但它不再具有refreshcontroll.我认为这是因为当我从我的scrollview中删除子视图时,我也从中删除了refreshcontroll.(如果我在刷新方法中再次添加refreshcontroll,我的scrollview将再次刷新控件)但是还有另一个问题.刷新后我的滚动视图向下移动..我附在图片上:

这就是我删除子视图的方法:

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

}
Run Code Online (Sandbox Code Playgroud)

这是刷新视图在刷新之前的样子: 在此输入图像描述

这是刷新后的样子: 在此输入图像描述

任何人都可以帮我解释为什么这会下降?

谢谢!

谢谢,这是解决方案:

let subViews = self.scrollView.subviews
for subview in subViews{
    println("for removing...")
    if (subview is PostLineItem) {
        subview.removeFromSuperview()
    }
    else {
        println("not removing..")
    }
}
Run Code Online (Sandbox Code Playgroud)

Lyn*_*ott 15

通过删除所有子视图,您还可以删除明确添加的子视图以外的子视图,例如刷新视图和布局约束.

(并且从评论中回答你的问题,布局约束实际上可以是子视图.我解释了如何删除除布局约束之外的所有子视图:https://stackoverflow.com/a/27281242/2274694.)

通常,我建议您将代码更改为更具体,以便仅删除您添加的视图.例如,您可以为方法中添加的子视图添加标记addPosts:

post.tag = 1000
Run Code Online (Sandbox Code Playgroud)

然后只删除带有该标记的子视图refresh::

let subViews = self.scrollView.subviews
for subview in subViews{
    if subview.tag == 1000 {
        subview.removeFromSuperview()
    }
}
Run Code Online (Sandbox Code Playgroud)

确保您不删除自己未明确添加的任何子视图.

编辑:事实证明,OP添加的子视图都是自定义类型,PostLineItem因此标签是不必要的,因为我们可以删除所有的PostLineItems:

for subview in self.view.subviews {
    if subview is PostLineItem {
        subview.removeFromSuperview()
     }
}
Run Code Online (Sandbox Code Playgroud)