【问题标题】:Observing Value for TableView观察 TableView 的值
【发布时间】:2017-11-25 10:04:41
【问题描述】:

我正在创建一个表格视图,当单元格数量增加或减少时,它的高度会动态变化。为了完成这个,我在我的 tableview 中添加了一个观察者:

tableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)

我通过以下方法收到这个:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    tableView.frame = CGRect(x: tableView.frame.origin.x, y: tableView.frame.origin.y, width: tableView.frame.size.width, height: tableView.contentSize.height)
    tableView.reloadData()
}

但是,当我运行它时,我得到一个错误:

Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffeed414ff8)

我确定这些行会导致错误并且已经尝试调用super.observeValue(...)

任何帮助将不胜感激。

【问题讨论】:

  • 你为什么要这样做? tableviews 的高度是容器在屏幕上的高度,它的 contentSize.height 是它正在滚动的内容的高度。当这两个值相等时,您的表格将不会滚动。

标签: ios swift uitableview tableview observers


【解决方案1】:

在 Objective C 中键值观察的工作方式是,你观察到的每个对象的每个观察到的变化都通过相同的 observeValue 函数。在从情节提要加载 tableView 之前,您的观察函数完全有可能被调用,这就是您崩溃的原因。

在触摸 tableView 之前,您应该至少检查两件事:

  1. 是您的 tableView 的对象参数 ===(即这是您要查找的对象)
  2. keyPath == 是您要在此对象上观察的 keyPath 吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多