观察 UITableViewCell 中 NSArray 的更改

Observing changes of an NSArray in a UITableViewCell

提问人:vc7 提问时间:5/29/2014 最后编辑:vc7 更新时间:5/29/2014 访问量:780

问:

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

虽然我需要观察 .我能够观察其他属性和其他类型,并且我已经实现了相关的数组访问器,用于在自定义单元格类的数组中添加删除对象。 无法获得数组更改的通知。tableViewControllerotherViewControllerNSString

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

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
iOS Objective-C UITableView 键值观察

评论

0赞 wootage 5/29/2014
这可能是您如何访问数组中的项目的一些问题。查看这篇文章,希望对您有所帮助 qualitycoding.org/dot-notation-winsBut what I didn’t know was that direct ivar manipulation doesn’t trigger KVO
0赞 vc7 5/29/2014
对于与 KVO 相关的,我在这里使用点表示法。我不确定使用 ivar 是否会触发 KVO,我可以玩那个:)
0赞 Ken Kuan 5/29/2014
你的更新真的很奇怪。由于 tableview 有很多单元格,这将导致您在单元格中观察到随机数组。

答:

1赞 Ken Kuan 5/29/2014 #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: proxy 上触发。

如果要在此实现上触发 KVO,则应按如下方式实现阵列访问器:

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

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

希望这能帮到你。

评论

0赞 vc7 5/29/2014
这值得一试!!我会在有:)的东西后更新状态
0赞 wootage 5/29/2014 #2

您可以手动发送观察到的密钥的通知

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