我的应用中有一个UITableViewController,并添加了UIRefreshControl。然而有时候(我不知道如何重现它,它偶尔会发生),我在表格视图的顶部得到一些额外的空格,刷新控制甚至低于该值。
这就是它的样子(在左边闲置,在右边拉下来):
我没有任何线索可能导致这种情况。在我的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
})
}
}
答案 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边长的空标签。
我有类似的问题,在某些情况下,我的表视图插入被破坏了。一旦我使用这个“假”子视图,问题就消失了。我也在其他一些帖子中读过这个问题。解决方案是这样的。似乎是一个奇怪的行为/错误。
试一试:)