В AppDelegate.h
я создал следующее свойство,AppDelegate: этот класс не является значением ключа кодирования совместимый для ключа ---
@property (strong, nonatomic) NSMutableDictionary *googleUserDetailsDictionary;
В AppDelegate.m
,
static NSString *kGoogleDetails = @"googleDetails"; @synthesize googleUserDetailsDictionary;
I мы создали специальный метод в AppDelegate.m
, в котором я добавил следующую строку: [self setValue:googleUserDetailsDictionary forKey:kGoogleDetails];
В ViewController, который я хотел быть наблюдателем для googleUserDetailsDictionary
собственности,
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; [appDelegate addObserver:self forKeyPath:@"googleUserDetailsDictionary" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:kGoogleDetails]) {
NSLog(@"This is change taking place: %@ \t\t", change);
}
}
Тогда я получаю следующую ошибку только тогда, когда я пытаюсь открыть ViewController
: ** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<FIRA_AppDelegate-1470253453284 0x7fd4fa839410> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key googleDetails.'
Это сработало! :) Но у меня есть сомнения. Я прочитал, что только подклассы NSObject внутренне подчиняются протоколу NSKeyValueCoding, тогда как для других классов мы должны его вручную установить. Но я на самом деле этого не делал для UIAppDelegate, но все-таки это сработало! Как? – Viki
Также, если вам интересно ответить на это: http://stackoverflow.com/questions/38758112/understanding-the-concept-ensuring-kvc-compliance – Viki
Когда вы работаете в Objective-C, большинство классов являются подклассами NSObject , (Проверьте свою декларацию класса в AppDelegate.h.) В Swift становится все более озабоченным. –