UITableView和UIRefreshControl因未知原因被移动

时间:2015-03-24 19:04:24

标签: ios uitableview cocoa-touch uirefreshcontrol

我的应用中有一个UITableViewController,并添加了UIRefreshControl。然而有时候(我不知道如何重现它,它偶尔会发生),我在表格视图的顶部得到一些额外的空格,刷新控制甚至低于该值。

这就是它的样子(在左边闲置,在右边拉下来):

screenshot

我没有任何线索可能导致这种情况。在我的viewdidload中,我只是实例化刷新控件并调用设置属性标题的更新函数。我已经移动了将刷新控件添加到viewDidAppear中的表视图,就像我在别处读到的那样。这就是代码的样子:

override func viewDidLoad() {
    super.viewDidLoad()
    self.refreshControl = UIRefreshControl()

    updateData()
}

override func viewDidAppear(animated: Bool) {
    refreshControl!.addTarget(self, action: "updateData", forControlEvents: UIControlEvents.ValueChanged)
    tableView.insertSubview(self.refreshControl!, atIndex: 0)
}

func updateData() {
    //...
    ServerController.sendParkinglotDataRequest() {
        (sections, plotList, updateError) in
        //...

        // Reload the tableView on the main thread, otherwise it will only update once the user interacts with it
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            self.tableView.reloadData()

            // Update the displayed "Last update: " time in the UIRefreshControl
            let formatter = NSDateFormatter()
            formatter.dateFormat = "dd.MM. HH:mm"
            let updateString = NSLocalizedString("LAST_UPDATE", comment: "Last update:")
            let title = "\(updateString) \(formatter.stringFromDate(NSDate()))"
            let attributedTitle = NSAttributedString(string: title, attributes: nil)
            self.refreshControl!.attributedTitle = attributedTitle
        })
    }
}

2 个答案:

答案 0 :(得分:3)

您是否需要将刷新控件添加为tableView的子视图?我认为您需要做的就是分配self.refreshControl。根据文件:

  

此属性的默认值为nil。

     

为此属性指定刷新控件会将控件添加到   查看控制器的相关接口。你不需要设置   将视图与视图关联之前的刷新控件的框架   控制器。视图控制器更新控件的高度和宽度   并适当地确定其位置。

viewDidAppear中添加子视图可能会多次执行。如果你从一个单元格中推出一个控制器并弹回,这将再次被调用。可能是insertSubview检查刷新是否已经存在父级并首先将其删除,因此可能不是您的问题。您只应在控制器第一次出现时执行插入操作。

updateData也可能会多次添加。

所以我认为你只需要分配self.refreshControl,然后像使用addTarget一样为刷新操作添加处理程序,但这次是在self.refreshControl上进行的。

您也可以从故事板中完成所有这些操作。在storyboard中,选择UITableViewController,在属性检查器上,只需将Refreshing属性设置为enabled。这会在表中添加UIRefreshControl,您可以在视图层次结构中看到它。然后,您可以直接从刷新控件中按CTRL拖动到.h文件中,并为valueChange添加一个操作,当您下拉表中的刷新控件时将触发该操作。

答案 1 :(得分:0)

好吧,我相信您描述的行为可能不一定是由刷新控件引起的。 根据您在桌面视图下方没有任何其他子视图的事实,我建议您尝试在桌面视图下方放置一个“假”视图。我通常更喜欢带有0边长的空标签。

enter image description here

我有类似的问题,在某些情况下,我的表视图插入被破坏了。一旦我使用这个“假”子视图,问题就消失了。我也在其他一些帖子中读过这个问题。解决方案是这样的。似乎是一个奇怪的行为/错误。

试一试:)