刷新控件在导航栏返回后会导致TableView的第一个单元格出现问题

3
我有一个嵌入在导航控制器中的TableView(并且它嵌入在TabBar控制器中)。每个单元格中都有一个用户名按钮,用于跳转到用户的个人资料页面。

enter image description here

然而,当我在个人资料页面的导航栏上点击“返回”后,回到表格视图时,似乎出现了一些错误。

enter image description here

enter image description here

如果我再次下拉刷新,这次顶部行的用户名将无法点击,而其他行则按预期工作。
请注意,在tableView中,我在viewDidLoad中调用self.theRefreshControl = UIRefreshControl(),但我不确定在使用返回按钮后是否已调用。
请注意,我使用prepareForSegue执行segue。

总结

  • 如果我进入通知页面并尝试点击用户名,用户名按钮单击和segue都有效。

  • 如果我进入通知,并下拉刷新,则第一行中的用户名按钮无法使用。

  • 如果我进入通知并不进行任何刷新,则用户名按钮的segue和返回均有效(因此没有错误)。

  • 如果我在通知中下拉刷新,则refreshControl图标会出现并消失,但现在,它不允许我点击顶部行的用户名按钮。

  • 如果我在通知上进行刷新,则无法点击顶部行的用户名。如果我单击第二个单元格中的第二个用户名,它会segue到用户的个人资料,但当我单击返回按钮时,它会出现以下错误:

enter image description here

在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之前它正常工作吗? - Quantaliinuxite
是的,在segue之前,用户名按钮可以正常工作。我刚刚意识到,如果我进入那个页面,而不进行下拉刷新,它就可以正常工作。但是一旦我下拉(触发刷新),然后再次点击用户名按钮,它就无法执行segue了。 - senty
https://dev59.com/D2Af5IYBdhLWcg3wmzpL - Mahesh reddy
@Maheshreddy 我按照提供的答案做了同样的事情。我还让另一个页面的刷新控件工作了,它也正常运行。现在我正在尝试在这里做同样的事情,但是没有正常工作。 - senty
1
我的猜测是你的 refreshControl 在单元格前面,所以最后尝试一下这个:在 viewDidLoad 中使用 tableView.sendSubviewToBack(theRefreshControl) - Quantaliinuxite
@Quantaliinuxite,太棒了!你的解决方案神奇地起作用了!请将其添加为答案,我会接受赏金。 - senty
1个回答

10

您应该这样实例化refreshControl:

override func viewDidLoad() {
    let refreshControl = UIRefreshControl()
    refreshControl.addTarget(self, action: "refresh:", forControlEvents: .ValueChanged)
    tableView.backgroundView = refreshControl // <- THIS!!!
}

正如在这个答案中所述。

我猜你的refreshControl可能在单元格的前面,如果上述方法不起作用,请尝试在viewDidLoad中使用tableView.sendSubviewToBack(theRefreshControl)

编辑:由于tableView.sendSubviewToBack(theRefreshControl)是解决方案,考虑向Apple报告错误,因为当您将refreshControl设置为tableView.backgroundView时,它应该自动发生。


我的代码看起来和这个很相似,除了这一行:tableView.backgroundView = refreshControl。(请查看我的更新答案,我刚刚在ViewDidLoad中添加了我的代码)。我尝试在self.tableView.addSubview(theRefreshControl)之前和之后都加上了tableView.backgroundView = refreshControl,但不幸的是没有成功。 - senty
你需要移除 self.tableView.addSubview:。另外,你调用了 endRefreshing: 吗? - Quantaliinuxite
是的,我正在调用 self.theRefreshControl.endRefreshing()。我将我的代码添加到问题中。等一下。 - senty
非常感谢您的时间!这个 sendSubviewToBack 解决了我的问题。所以我使用了 tableView.addSubview(theRefreshControl)tableView.sendSubviewToBack(theRefreshControl)。我没有使用 tableView.backgroundView = refreshControl。@Quan~,再次感谢你啊。23小时后让我接受赏金.. XoXo - senty
1
没问题,总是很愉快的! :) - Quantaliinuxite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接