Наблюдая за свойством редактирования UITableViewController - PullRequest
9 голосов
/ 29 сентября 2010

Почему я не могу наблюдать свойство editing экземпляра UITableViewController?

Я использую следующий код:

[self addObserver:self 
       forKeyPath:@"editing" 
          options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
          context:NULL];

И реализовали метод:

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context

... но метод observeValueForKeyPath никогда не вызывается при изменении этого значения.


Согласно Apple Обеспечение соответствия KVC раздел:

Для свойств, которые являются атрибутом или отношением «один к одному», для этого требуется, чтобы ваш класс:

  • Реализуйте метод с именем -<key>, -is<Key> или используйте переменную экземпляра <key> или _<key>.
  • Если свойство изменчиво, оно также должно реализовывать -set<Key>:.
  • Ваша реализация метода -set<Key>: не должна выполнять проверку.
  • Ваш класс должен реализовать -validate<Key>:error:, если для ключа подходит валидация.

В документации к свойству editing указано, что оно определено как:

@property(nonatomic, getter=isEditing) BOOL editing

Поскольку это свойство не является изменяемым, единственная точка, к которой оно должно соответствовать, - это первая (т.е., например, определен метод -is<Key>). Вы можете увидеть, что он соответствует этому, посмотрев объявление свойства и заметив, что определен метод isEditing. Таким образом, он должен быть совместимым с наблюдением значения ключа. Почему это не работает?

1 Ответ

22 голосов
/ 29 сентября 2010

Вы путаете Key-Value Кодирование соответствие Key-Value Наблюдение соответствия.Свойство является KVC-совместимым, что означает, что вы можете использовать [myViewController valueForKey:@"editing"] для доступа к нему (если вам нравится печатать), но это не значит, что оно является KVO-совместимым.

KV O -обеспечение достигается с помощью объекта, реализующего либо установщик, совместимый с KVC (пункты 2 и 3), который KVO будет автоматически переносить, либо проводящий вручную уведомления KVO, отправляя себе will / didChangeValueForKey: сообщения.

UIViewController и UITableViewController публично не реализуют setEditing:;если они вообще не реализуют его, то KVO автоматически оборачивается.Это оставляет ручные уведомления.Если вы не получаете никаких уведомлений KVO для этого свойства (и вы на самом деле нажимаете это сообщение addObserver:forKeyPath:options:context:), это говорит о том, что эти классы не реализуют в частном порядке setEditing: и не отправляют вручную уведомления KVO.

Следовательно,свойство не доступно для наблюдения.

Если единственный способ что-либо установить свойство editing - это отправить контроллеру сообщение setEditing:animated:, тогда вы можете переопределить setEditing:animated: и отправлять уведомления KVO самостоятельно с вашегореализации, и тогда свойство будет наблюдаемым.

...