在 NavBar 上使用 Back 后,RefreshControl 对 TableView 的第一个单元格产生错误

Posted

技术标签:

【中文标题】在 NavBar 上使用 Back 后,RefreshControl 对 TableView 的第一个单元格产生错误【英文标题】:RefreshControl bugs first Cell of TableView, after using Back on NavBar 【发布时间】:2016-02-14 11:30:22 【问题描述】:

我在 NavigationController 中嵌入了一个 TableView(并且它嵌入在 TabBar 控制器中)。我在每个单元格中都有一个用户名按钮,用于连接用户的个人资料。

但是,当我在个人资料页面的导航栏上点击“返回”并被引导回 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),但不幸的是没有运气

【问题讨论】:

在segue之前工作正常吗? 是的,用户名按钮在 segue 之前可以正常工作。我刚刚意识到,如果我转到该页面,并且不拉刷新,它工作正常。但是,一旦我下拉(所以触发刷新),然后它无法在用户名按钮单击时再次执行 segue。 ***.com/questions/24475792/… @Maheshreddy 我对this answer provided 所做的完全一样。我还让刷新控件在另一个页面上工作,该页面正在工作。我正在尝试在这里做同样的事情,但无法正常工作。 我的猜测是您的 refreshControl 在您的单元格前面,所以最后尝试一下:tableView.sendSubviewToBack(theRefreshControl) in viewDidLoad 【参考方案1】:

你应该实例化 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 时,它应该会自动发生

【讨论】:

我的看起来和这个很相似,除了tableView.backgroundView = refreshControl这一行。 (请检查我更新的答案,我刚刚在 ViewDidLoad 中添加了我的代码)。我尝试在self.tableView.addSubview(theRefreshControl) 之前和之后添加tableView.backgroundView = refreshControl,但不幸的是,没有运气 您必须删除self.tableView.addSubview:。另外,你打电话给endRefreshing:吗? 是的,我在打电话。 self.theRefreshControl.endRefreshing()。我在问题中添加我的代码。等一下。 非常感谢您的宝贵时间!!这个sendSubviewToBack 解决了我的问题。所以我使用了tableView.addSubview(theRefreshControl)tableView.sendSubviewToBack(theRefreshControl)。我没有使用tableView.backgroundView = refreshControl。 @Quan~,再次,非常感谢。当它让我在 23 小时内时,我会接受赏金.. XoXo 没问题,总是很开心! :)

以上是关于在 NavBar 上使用 Back 后,RefreshControl 对 TableView 的第一个单元格产生错误的主要内容,如果未能解决你的问题,请参考以下文章

更改滚动上的图像徽标

uniapp小程序中修改Vant组件navbar左箭头的颜色及图标与背景

Bootstrap Navbar 卡在移动设备上

在指向向量的智能指针上使用 push_back() 时出现运行时错误

Bootstrap——导航条(navbar)

单击汉堡图标并调整窗口大小后,Navbar消失(我不希望它隐藏)