Подтвердить что ты не робот

Возможно ли наблюдать свойство readonly объекта в Cocoa Touch?

Я попытался наблюдать (visonly) visibileViewController свойство UINavigationController без успеха. Я смог успешно наблюдать свойство readwrite, которое я определил для тестирования в другом классе.

Возможно ли использовать наблюдаемые атрибуты readonly?

4b9b3361

Ответ 1

Да, можно наблюдать свойства только для чтения. Однако, если объект, объявляющий это свойство, вносит изменения в значение этого свойства таким образом, который не является Наблюдение за ключевыми значениями compliant (например, изменяет значение переменной экземпляра, поддерживая это свойство напрямую без уведомлений willChangeValueForKey: и didChangeValueForKey:), тогда наблюдатели автоматически не будут уведомлены системой KVO. Если вы можете убедиться, что значение этого свойства меняется, и ваши наблюдатели не уведомляются, я (1) разместил бы здесь какой-либо код здесь или где-либо еще, чтобы другие могли помочь вам найти вашу ошибку и (2), если нет ошибок в ваш код, файл ошибки на Apple радар.

Ответ 2

Да. Легкий способ реализовать его в своем классе состоит в том, чтобы объявить свойство как readonly в файле .h и переопределить его как записываемый в приватном интерфейсе в файле .m. Таким образом, вы можете синтезировать и получать уведомления об изменениях автоматически.

В файле .h:

@interface MyClass : NSObject
@property (nonatomic, readonly) BOOL foo;
@end

В файле .m

@interface MyClass ()
@property (nonatomic, readwrite) BOOL foo;
@end

@implementation MyClass

@synthesize foo;

- (void)bar {
    // Observers will see the change
    self.foo = YES;
}

@end

Ответ 3

Вы можете, безусловно, наблюдать свойства readonly, но имейте в виду, что для того, чтобы KVO работал, вам нужно быть совместимым с KVC, что означает использование либо setter/getter для свойства (поскольку вы только на чтение, вы не получаете setter бесплатно через @synthesize) или метод свойства -setValue:forKey:.

Ответ 4

Несколько другой ответ:

@interface MyClass : NSObject
@property (nonatomic, readonly) BOOL foo;
@end

В файле .m

@interface MyClass ()
@property (nonatomic, readwrite) BOOL foo;
@end

@implementation MyClass

+ (NSSet *)keyPathsForValuesAffectingFoo {
    return [[NSSet alloc] initWithObjects:NSStringFromSelector(@selector(foo)), nil];
}

@end

Ответ 5

Это определенно возможно с помощью NSKeyValueObserving. Свойства фактически имеют реализации getter/setter, они просто выполняются для вас компилятором с помощью ключевого слова @synthesize в реализации классов Objective-C. Поскольку протокол наблюдения за ключом основан на стандартных соглашениях об уловителе/​​сеттере в Objective-C, свойства наблюдения работают нормально. Документация (связанная выше) даже упоминает свойства класса по имени:

"Неформальный протокол NSKeyValueObserving (KVO) определяет механизм, позволяющий объектам получать уведомления об изменениях указанных свойств других объектов.