相关疑难解决方法(0)

观察NSMutableArray以进行插入/删除

类具有NSMutableArray类型的属性(和实例var),具有合成访问器(via @property).如果使用以下方法观察此数组:

[myObj addObserver:self forKeyPath:@"theArray" options:0 context:NULL];
Run Code Online (Sandbox Code Playgroud)

然后在数组中插入一个对象,如下所示:

[myObj.theArray addObject:NSString.string];
Run Code Online (Sandbox Code Playgroud)

发送observeValueForKeyPath ...通知.但是,以下内容确实发送了正确的通知:

[[myObj mutableArrayValueForKey:@"theArray"] addObject:NSString.string];
Run Code Online (Sandbox Code Playgroud)

这是因为mutableArrayValueForKey返回一个负责通知观察者的代理对象.

但是,合成访问器不应该自动返回这样的代理对象吗?解决这个问题的正确方法是什么 - 我应该编写一个只调用的自定义访问器[super mutableArrayValueForKey...]吗?

cocoa key-value-observing key-value-coding

74
推荐指数
3
解决办法
3万
查看次数

removeAllObjects上的KVO分别触发每个项目的NSKeyValueChangeRemoval

我在看一个NSArray propertyKVO.我已经KVC这篇文章中实现了,我也实现了大多数KVC数组访问器.为了改变它,我使用mutableArrayValueForKey.它工作正常,除了2个问题:

  1. 当我打电话时removeAllObjects,我会为每个被删除的项目进行NSKeyValueChangeRemoval更改.我希望只收到一个包含所有已删除索引的通知.NSKeyValueChangeRemoval

  2. 同样地,当我打电话时addObjectsFromArray:,我得到NSKeyValueChangeInsertion每个添加的项目.我只想收到一条NSKeyValueChangeInsertion包含所有添加索引的通知.


请注意,我确实实现了KVC方法remove<Key>ItemsAtIndexes:insert<Key>Items:atIndexes:.虽然他们没有打电话.

我使用以下变通方法:

- (void)removeAllObjectsWorkaroundFromArray:(NSMutableArray *)modelArray {
    NSRange indexRange;
    indexRange.length = modelArray.count;
    indexRange.location = 0;
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:indexRange];
    [modelArray removeObjectsAtIndexes:indexSet];
}

- (void)addObjectsFromArrayWorkaroundWithArray:(NSMutableArray *)modelArray arrayToAdd:(NSArray *)arrayToAdd {
    NSRange indexRange;
    indexRange.length = arrayToAdd.count;
    indexRange.location = modelArray.count;
    NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:indexRange];
    [modelArray …
Run Code Online (Sandbox Code Playgroud)

key-value-observing ios kvc

5
推荐指数
1
解决办法
315
查看次数

标签 统计

key-value-observing ×2

cocoa ×1

ios ×1

key-value-coding ×1

kvc ×1