【问题标题】:Observing changes of an NSArray in a UITableViewCell在 UITableViewCell 中观察 NSArray 的变化
【发布时间】:2014-05-29 08:47:09
【问题描述】:

我正在使用KVO 观察数组的变化,数组将在tableViewControllertableView 中的单元格中更改。我已将单元格中的数组分配给公共NSArray 属性以供其他视图控制器使用,它们的地址相同。

虽然我需要从otherViewController 观察tableViewController 的属性值变化。我能够观察NSString 和其他类型的其他属性,并且我已经实现了 相关的数组访问器,用于在自定义单元类的数组中添加删除对象。 但是无法得到数组变化的通知。

我使用NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 作为选项。我想问题是我把数组放在单元格中导致KVO 无法到达那里?

SDK 版本:iOS 7.1

这是我对这部分的视图层次结构:

 tableViewController            
+-----------------------------+
| tableView                   |
|+----------+                 | 
||   cell   |                 |
||+--------+|        public   |
|||        ||        array    |
||| array  ||        property |
||| +----+ || assign +----+   |    (Observer)
||| |    |-++--------|    |<--+--[ otherViewController ]
||| +----+ ||   to   +----+   |
||+--------+|                 |
||          |                 |
|+----------+                 |
+-----------------------------+

更新

为了更清楚,我在这里添加我的实现

otherViewController- viewDidLoad方法中:

[self addObserver:self forKeyPath:@"self.tableViewController.theArray" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil];

tableViewControllertableView:cellForRowAtIndexPath:

self.theArray = cell.theArray

【问题讨论】:

  • 这可能是你如何访问数组中的项目But what I didn’t know was that direct ivar manipulation doesn’t trigger KVO的一些问题。查看这篇文章,希望它对你有帮助qualitycoding.org/dot-notation-wins
  • 对于 KVO 相关的,我在这里使用点符号。我不确定使用 ivar 是否会触发 KVO,我可以使用它:)
  • 你的更新真的很奇怪。由于 tableview 有很多单元格,这将导致您在单元格中观察到随机数组。

标签: ios objective-c uitableview key-value-observing


【解决方案1】:

我猜你会观察到单元格的键路径“数组”

    [cell addObserver:self forKeyPath:@"array" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];

依赖https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html

自动更改通知仅在 mutableArrayValueForKey: 代理上触发。

如果你想在这个实现上触发 KVO,你应该实现数组访问器如下:

- (void)addArrayObject:(id)object {
    NSMutableArray *notifiableArray = [self mutableArrayForKeyPath:@"array"];
    [notifiableArray addObject:object];
}

并记住在重复使用单元格时删除旧的观察者。

希望对你有帮助。

【讨论】:

  • 这个值得一试!!有事后我会更新状态:)
【解决方案2】:

您可以手动发送观察键的通知

[self willChangeValueForKey:@"your key path"];
[array addObject:object];`
[self didChangeValueForKey:@"your key path"];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2019-08-18
    • 2012-08-05
    • 2010-11-09
    • 2018-02-26
    相关资源
    最近更新 更多