在 NavBar 上使用 Back 后,RefreshControl 会导致 TableView 的第一个 Cell 出错
RefreshControl bugs first Cell of TableView, after using Back on NavBar
我在 NavigationController 中嵌入了一个 TableView(并且嵌入在 TabBar 控制器中)。我在每个单元格中都有一个用户名按钮,可以连接到用户的个人资料。
然而,在我点击个人资料页面的导航栏上的 'back' 并返回到 tableview 之后,我好像遇到了什么问题。
如果我再次下拉,它会刷新,但这次,顶行的用户名变得不可点击,而其他行按预期工作。
请注意,我在 tableView 的 viewDidLoad
中调用了 self.theRefreshControl = UIRefreshControl()
,但我不确定在使用“后退”按钮后它是否被调用。
请注意,我使用 prepareForSegue
执行 segue。
总结
如果我转到通知页面并尝试单击用户名,单击用户名按钮并且继续工作
如果我转到通知并拉动刷新,第一行的用户名按钮不起作用
如果我转到通知但不进行任何刷新,用户名按钮会继续并返回(因此不会出现错误)。
如果我转到通知并拉动刷新,refreshControl 图标出现又消失,但现在,它不允许我点击顶行的用户名按钮。
如果我刷新通知,它不会让我点击第一行的用户名。如果我点击第二个单元格中的第二个用户名,它会转到用户的个人资料,但是当我点击后退按钮时,它会出现这样的错误:
ViewDidLoad()中的代码:
override func viewDidLoad() {
super.viewDidLoad()
self.theRefreshControl = UIRefreshControl()
self.theRefreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
self.theRefreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
self.tableView.addSubview(theRefreshControl)
}
func refresh(sender: AnyObject) {
if isFirstLoad == false {
currentPage = 1
getStuff()
}
self.theRefreshControl.endRefreshing()
}
我也试过在self.tableView.addSubview(theRefreshControl)
上方和下方添加self.tableView.backgroundView = refreshControl
;还尝试用 self.tableView.backgroundView = refreshControl
替换 self.tableView.addSubview(theRefreshControl)
但不幸的是没有运气
实例化 refreshControl 的方式如下:
override func viewDidLoad() {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
tableView.backgroundView = refreshControl // <- THIS!!!
}
如this answer所述。
我猜你的 refreshControl 在你的单元格前面,所以如果上面的方法不起作用试试这个:tableView.sendSubviewToBack(theRefreshControl)
in viewDidLoad
编辑:由于 tableView.sendSubviewToBack(theRefreshControl)
是解决方案,请考虑向 Apple 提交错误,因为当您将 refreshControl
设置为tableView.backgroundView
我在 NavigationController 中嵌入了一个 TableView(并且嵌入在 TabBar 控制器中)。我在每个单元格中都有一个用户名按钮,可以连接到用户的个人资料。
然而,在我点击个人资料页面的导航栏上的 'back' 并返回到 tableview 之后,我好像遇到了什么问题。
如果我再次下拉,它会刷新,但这次,顶行的用户名变得不可点击,而其他行按预期工作。
请注意,我在 tableView 的 viewDidLoad
中调用了 self.theRefreshControl = UIRefreshControl()
,但我不确定在使用“后退”按钮后它是否被调用。
请注意,我使用 prepareForSegue
执行 segue。
总结
如果我转到通知页面并尝试单击用户名,单击用户名按钮并且继续工作
如果我转到通知并拉动刷新,第一行的用户名按钮不起作用
如果我转到通知但不进行任何刷新,用户名按钮会继续并返回(因此不会出现错误)。
如果我转到通知并拉动刷新,refreshControl 图标出现又消失,但现在,它不允许我点击顶行的用户名按钮。
如果我刷新通知,它不会让我点击第一行的用户名。如果我点击第二个单元格中的第二个用户名,它会转到用户的个人资料,但是当我点击后退按钮时,它会出现这样的错误:
ViewDidLoad()中的代码:
override func viewDidLoad() {
super.viewDidLoad()
self.theRefreshControl = UIRefreshControl()
self.theRefreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
self.theRefreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
self.tableView.addSubview(theRefreshControl)
}
func refresh(sender: AnyObject) {
if isFirstLoad == false {
currentPage = 1
getStuff()
}
self.theRefreshControl.endRefreshing()
}
我也试过在self.tableView.addSubview(theRefreshControl)
上方和下方添加self.tableView.backgroundView = refreshControl
;还尝试用 self.tableView.backgroundView = refreshControl
替换 self.tableView.addSubview(theRefreshControl)
但不幸的是没有运气
实例化 refreshControl 的方式如下:
override func viewDidLoad() {
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
tableView.backgroundView = refreshControl // <- THIS!!!
}
如this answer所述。
我猜你的 refreshControl 在你的单元格前面,所以如果上面的方法不起作用试试这个:tableView.sendSubviewToBack(theRefreshControl)
in viewDidLoad
编辑:由于 tableView.sendSubviewToBack(theRefreshControl)
是解决方案,请考虑向 Apple 提交错误,因为当您将 refreshControl
设置为tableView.backgroundView