У меня есть КВО-способный класс (назовем его Observee
), который affectedValue
динамическое свойство пораженной affectingValue
собственности. Зависимость между свойствами определяется путем применения метода +keyPathsForValuesAffectingAffectedValue
.КВО: + keyPathsForValuesAffecting <Key> не работает с (подкласс) NSObjectController
Установка значения для affectingValue
affectedValue
сообщает, что изменилось, как я ожидал, еслиOvservee
не является подклассом NSObjectController
. Полный пример следующим образом:
@interface Observee : NSObject // or NSObjectController
@property (readonly, strong, nonatomic) id affectedValue;
@property (strong, nonatomic) id affectingValue;
@property (strong, nonatomic) NSArrayController *arrayController;
@end
@implementation Observee
@dynamic affectedValue;
- (id)affectedValue { return nil; }
+ (NSSet *)keyPathsForValuesAffectingAffectedValue {
NSLog(@"keyPathsForValuesAffectingAffectedValue called");
return [NSSet setWithObject:@"affectingValue"];
}
@end
@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (strong, nonatomic) Observee *observee;
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
self.observee = [[Observee alloc] init];
[self.observee addObserver:self
forKeyPath:@"affectedValue"
options:NSKeyValueObservingOptionNew
context:NULL];
NSLog(@"setting value to affectingValue");
self.observee.affectingValue = @42;
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
NSLog(@"affected key path = %@", keyPath);
}
@end
пример работает отлично и выходы, как следующее, когда Observee
происходит NSObject
:
keyPathsForValuesAffectingAffectedValue called
setting value to affectingValue
affected key path = affectedValue
но когда Observee
происходит NSObjectController
:
keyPathsForValuesAffectingAffectedValue called
setting value to affectingValue
(обратите внимание, что «пострадавших key path = affectedValue "отсутствует.)
Кажется, что в обоих случаях вызывается keyPathsForValuesAffectingAffectedValue
, но в последнем случае он не работает.
Кроме того, любые ключевые пути, включающие экземпляр (подкласса) NSObjectController
не будет влиять на другие ключевые пути, такие как:
@implementation SomeObject
// `someValue` won't be affected by `key.path.(snip).arrangedObjects`
+ (NSSet *)keyPathsForValuesAffectingSomeValue {
return [NSSet setWithObject:@"key.path.involving.anNSArrayController.arrangedObjects"];
}
@end
Как объявить зависимость между основными путями в таких случаях? И почему все это происходит?
(Да, я знаю о will/didChangeValueForKey:
и друзья, но подведению каждого затрагивающей ключевого пути с (ругой) сеттерами страшно, и я хотел бы избежать этого.)
Если вы обнаружите, почему, пожалуйста, поделитесь;) Я сейчас наблюдаю странное поведение для 'KVO' с классами, созданными из сущностей Core Data. – Colas
Вы пытались использовать '+ (NSSet *) keyPathsForValuesAffectingValueForKey: (NSString *) key' вместо этого? – Colas
Реализация по умолчанию '+ keyPathsForValuesAffectingValueForKey:' просто ищет '+ keyPathsForValuesAffecting' и возвращает свой результат - переопределение здесь не имеет значения. –
uasi