НаблюдатьValueForKeyPath не вызывается для свойства, содержащего объект C ++?

1

У меня странная проблема.

Мой класс объявляет свойство, которое просто удерживает указатель на объект C++:

@property (assign) CPPObject *representedObject;

В init этого класса Obj-C я регистрирую сам класс в качестве наблюдателя, чтобы получить уведомление, когда кто-то присваивает что-то моему свойству (да, я мог бы написать собственный наборщик... anywho!).

   [self addObserver:self
          forKeyPath:@"representedObject"
             options:NSKeyValueObservingOptionNew
             context:nil];

Демпинг observationInfo после регистрации в качестве наблюдателя выглядит нормально - должно быть зарегистрировано.

Однако мой observeValueForKeyPath:ofObject:change:context: метод никогда не вызывается.

Рассмотрение связанных тем StackOverflow не помогло мне решить эту проблему.
Свойство правильно установлено с помощью установки object.representedObject и т.д.

Любые подсказки, что может быть здесь рыбным?..
Плохая идея зарегистрироваться для self в методе init.?

Редактировать # 1

При использовании ручного сеттера вместо синтезируемого, который вызывается установщиком.

  • 2
    Зачем вам добавлять наблюдателя для себя, если вы могли бы просто переопределить установщик и получатель представленного объекта?
Теги:
key-value-observing

2 ответа

1

Если ваши наблюдения вообще не вызываются, я бы сначала предположил, что синтезированный аксессор не вызывается, возможно, потому, что кто-то напрямую обращается к ivars, чего вы не должны делать именно по этой причине. Попробуйте реализовать пользовательский сеттер (он может просто выполнить обычное назначение) и убедиться, что он вызван.


EDIT: мой следующий тест состоял бы в том, чтобы убедиться, что вы правильно назвали свой метод наблюдения. Я не знаю, является ли это Mac или iOS; на Mac, неправильное использование метода наблюдения не приведет к сбою приложения. На iOS это сработает, если только вам не удастся реализовать его где-то еще (суперкласс или реализовать в другом месте в вашей реализации).

Лично я мог бы вытащить минимальный тестовый пример в новый проект и посмотреть, можно ли воспроизвести его в одном файле. Я уверен, что когда вы закончите, это будет что-то глупое. Плохо названный метод. Два разных экземпляра одного класса (и вы смотрите на неправильный). Методы работают в том порядке, которого вы не ожидаете. Что-то вроде того.

  • 1
    Это забавный бит - вызывается ручной установщик. Не изменил никакую другую часть кода, то есть не бит, устанавливающий свойства! Просто странно.
  • 0
    Разве вам не нужно вызывать [self will/didChangeValueFor:@"representedObject"] вокруг назначения в установщике?
Показать ещё 1 комментарий
0

Вы должны использовать keyword dynamic для достижения KVO, как описано в документации Apple KVO Observing

  • 1
    Это Objective-C, а не Swift.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню