cocoa - 观察 Cocoa 中的键值对多关系

标签 cocoa key-value-observing key-value-coding

我正在尝试让键值观察适用于 NSMutableArray。下面是被观察类 MyObservee 的 .h 文件:

@interface MyObservee : NSObject {
    @private int someValue;
    @private NSMutableArray *someArray;
}

@property (readwrite,assign) int someValue;
- (NSMutableArray *)someArray;
@end

类MyObserver实现observeValueForKeyPath:ofObject:change:context:。以下是我添加观察者的方法:

MyObservee *moe = [[MyObservee alloc] init];
MyObserver *mobs = [[MyObserver alloc] init];

[moe addObserver:mobs 
      forKeyPath:@"someArray" 
         options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) 
         context:NULL];

[moe.someArray addObject:@"hi there"];

为什么 addObject: 消息没有随着 someArray 键路径的更改而触发?我感觉这里有一些我不完全理解的地方。

最佳答案

您需要实现 KVC programming guide 中定义的索引数组访问器。然后,您必须使用这些访问器来访问数组,KVO 触发才会起作用。您也可以调用-mutableArrayValueForKey:并使用该数组来 addObject: 等,它将依次调用访问器方法,并且 KVO 触发也会发生。还有用于 NSSet 的 set 访问器,请参阅 herehere .

示例:

@interface MyClass : NSObject
{
    NSMutableArray *_orders;
}

@property(retain) NSMutableArray *orders;

- (NSUInteger)countOfOrders;
- (id)objectInOrdersAtIndex:(NSUInteger)index;
- (void)insertObject:(id)obj inOrdersAtIndex:(NSUInteger)index;
- (void)removeObjectFromOrdersAtIndex:(NSUInteger)index;
- (void)replaceObjectInOrdersAtIndex:(NSUInteger)index withObject:(id)obj;


@end

关于cocoa - 观察 Cocoa 中的键值对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/477204/

相关文章:

ios - 带有KVO的iOS核心数据-valueForKey:NSManagedObject子类上的自定义属性?

swift - 我可以快速观察可选值吗?如果不是,我将如何尝试观察变化?

javascript - 在 JavaScript 中创建键/值对列表

macos - 沙盒应用程序中的 AppleScript `activate` 不会将窗口带到前台

swift - 复制 Metal 帧缓冲区纹理以供读取

objective-c - 使用 OCMock 模拟 KVO

swift - 保存文件但隐藏文件扩展名 - Cocoa with Key Value Coding

sprite-kit - 如何在 SKSpriteNode 位置属性上使用 KVO

objective-c - "Purge"命令的替代方案?

cocoa - 如何在 NSWindow 全屏模式下显示模式表,而不需要视觉上移动主窗口?