【问题标题】:UITableViewController doesn't seem to refresh when reloadData goes from non-zero to zero sections on iPad当 iPad 上的 reloadData 从非零部分变为零部分时,UITableViewController 似乎没有刷新
【发布时间】:2019-03-13 10:24:28
【问题描述】:

在 iPad 上,在 UISplitViewController 中,我在右侧部分有一个 UITableViewController,显示左侧所选内容的详细信息。因此,当我取消选择左侧的所有内容,从而在详细视图中将详细对象设置为 nil 时,我希望表格清除并显示一条消息以邀请用户选择一个元素。

这就是为什么我的详细 UITableViewController 子类中有以下内容:

var reference: Reference? {
    didSet {
        self.refreshInterface()
    }
}

func refreshInterface() {
    if let titleLabel = self.titleLabel {
        if let ref = reference {
            titleLabel.text = ref.projectName
        } else {
            titleLabel.text = NSLocalizedString("Please select a reference", comment: "")
        }
    }
    tableView.reloadData()
}

override func numberOfSections(in tableView: UITableView) -> Int {
    if(self.reference != nil) {
        return 5
    } else {
        return 0
    }
}

我用调试器检查了在我将引用设置为 nil 后,numberOfSections 被调用并返回 0。但是由于某种原因,表的所有 UI 都没有被清除。我仍然有与选择参考时相同的行和部分。我错过了什么吗?这是 Cocoa Touch 中的潜在错误吗?

【问题讨论】:

  • 您不是在后台线程上执行上述操作,是吗?可能值得检查。
  • 我真的不知道,但是当我看到“Cocoa Touch 中的潜在错误”时,我倾向于首先责怪其他事情——比如我! (说真的,我不是那么出色的程序员——即使 40 年后也是如此。)也就是说,你有没有我可以尝试的 completeduplicatable 的东西?我对UITableViews 非常满意,同时拥有 iPad 和 iPhone,也许可以提供帮助。原来如此?你给我的还不够。
  • @dfd 你完全正确。当有人告诉我他们认为他们在如此成熟的框架中发现了一个错误时,我也非常怀疑。但是话又说回来,我已经使用表格视图很长时间了,我想我已经尝试了一切。即使在这里,我也希望这是一个后台线程问题,但我正在使用 Firebase 来查询我的数据,并且通常 Firebase 回调在主线程上运行。可以肯定的是,我将 refreshInterface() 调用包装在 DispatchQueue.main.async{} 中,但它并没有改变任何东西。
  • 现在您提到了我从未使用过的东西 - Firebase。你认为这是罪魁祸首吗?如果是这样,也许可以这样标记它?
  • 我想通了。请参阅下面的答案。

标签: ios swift uitableview ipad uisplitviewcontroller


【解决方案1】:

我想通了。问题不在于我的详细视图控制器,而在于主控制器。我没有考虑到,当我在主视图中选择一个项目时显示详细视图控制器时,拆分视图控制器每次都会创建详细视图控制器的另一个实例。由于我在旧实例上设置细节对象,旧实例已更新,但已显示另一个实例。为了解决我的问题,我所要做的就是确保我总是在细节视图控制器的当前实例上设置我的细节对象。

我希望这对某人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多