我被KVC/KVO迷住了.超级强大.但是有一个问题.我试图成为真正的MVC道德,但我认为没有办法使用观察模式来监视Objective-C类实例的分配或释放.
这实际上很重要,因为我有一个模型具有细粒度的内部消息,我想从控制器(或委托)观察.对我来说,绊脚石是我没有看到,在模型外部,我可以删除一个即将被解除分配的子组件的观察者,而控制器不知道模型的内部逻辑会破坏封装.
有人可以为这种情况建议一种方法.
谢谢,道格
我有一个NSDictionary,其中包含(我的自定义)GTPerson对象.GTPerson有一个NSMutableSet *parents属性,我使用@property和@synthesize.
在我的NSDictionary之外,我想过滤掉所有没有父母的GTPerson对象,即父母的数量是0.
我正在使用以下代码:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"parents.count = 0"];
NSArray *np = [[people allValues] filteredArrayUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,我收到以下错误:
[<GTPerson 0x18e300> valueForUndefinedKey:]: this class is not key value coding-compliant for the key count.
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<GTPerson 0x18e300> valueForUndefinedKey:]: this class is not key value coding-compliant for the key count.'
为什么它试图调用countGTPerson而不是它的parents属性?
我在KVO上卖,但如果以明显的方式使用它是同步的.我想在我快速连续发射许多KVO消息的情况下使用它,这导致我的应用程序在处理KVO消息时停止运行.有人可以建议一种方法 - 也许使用NSOperation或NSThread- 这将在这里工作?
我的目标是尽可能保持KVO的分离,灵活性.
我正在尝试通过代码监视NSMutableArray以进行更改.我想在数组更改时添加一个观察者,但是我没有看到NotificationName应该是什么来实现这一点.
基本上,当修改数组时,我想执行自定义选择器.
macos xcode objective-c key-value-observing key-value-coding
有没有一种方法可以找出某个类是否符合键值的特定键?
cocoa cocoa-touch objective-c key-value-observing key-value-coding
我有一个NSDates数组,我想从数组中获取最大的NSDate.虽然我总是可以对它们进行排序并抓住第一个/最后一个,但是有没有办法用KeyValueCoding或其他一些快速的单行方式来做到这一点?我知道如果对象有一个日期属性,我可以使用像valueForKeyPath @"@ max.date"这样的东西,但如果对象是日期本身怎么办?
谢谢
目前我正在学习关键值编码的所有内容.
他们在文档中说:
密钥路径序列中的任何不符合适当密钥的键值编码的对象都会收到valueForUndefinedKey:消息.
我试图想象一个对象不符合键值编码的情况.怎么会发生这种情况?当我将UIView子类化时,这显然是合规的,对吧?但是当我用NSObject作为超类创建自己的对象时,那是怎么回事?当我创建一个没有超类的类时,那么肯定这不符合kv吗?
如果我有一个像这样的方法:
@interface CharacterSet
+ (NSArray *)allCharacterSets;
@end
Run Code Online (Sandbox Code Playgroud)
我可以使用Cocoa绑定绑定它吗?
我正在尝试将NSComboBox的内容值连接到它.当我进入CharacterSet.allCharacterSetsIB中的"模型密钥路径"字段时,它不起作用,说:
[addObserver:forKeyPath:@"CharacterSet.allCharacterSets"选项:0x0上下文:0x200275b80]被发送到与"CharacterSet"属性不符合KVC的对象.
我不知道还有什么可以尝试的.目前我必须allCharacterSets在我的自定义窗口控制器(或自定义窗口)中将返回值存储到ivar中以使其工作,这似乎是我不应该采取的额外步骤.
setValue:forKeyPath:在Apple的NSKeyValueCoding协议文档中的方法讨论开始于:
这种方法的默认实现[...]
现在,这可能只是让我陷入了语义,但是:
你能用:
[[NSUserDefaults standardUserDefaults] setValue:objectID forKey:"objectID"]
设置对象NSUserDefaults,然后使用以下方法检索该对象:
objectType *tempObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"objectID"]
?
所以要澄清,我要问的是,如果我使用setObject,我可以使用valueForKey吗?反之亦然,我可以使用setValue然后使用它来检索它objectForKey吗?
你为什么不能这样做?
如果我正确阅读,setObject/ objectForKey处理NSDictionary和setValue/或valueForKey处理KVC,对吗?
我只是想要更好地了解两者之间的差异.
谢谢.干杯.
key-value-coding ×10
objective-c ×6
cocoa ×3
cocoa-touch ×3
ios ×2
iphone ×2
key ×1
key-value ×1
macos ×1
nsdate ×1
protocols ×1
xcode ×1