1

Я использовал NSNotificationCenter для обмена сообщениями приложений до этого, но сегодня я нашел странную лазейку. Работая над проектом клиента, есть несколько подклассов UIView, которым необходимо будет получать NSNotifications, которые я уже размещаю/получаю в другом месте приложения.Уведомления NSNotificationCenter, не полученные подклассом UIView

Я вызываю addObserver: self из метода init и используя #defined константы для имени уведомления. Когда уведомление, которое я зарегистрировал для получения, отправляет каждый другой объект, который прослушивает (все подклассы UIViewController), получает уведомление, за исключением моего подкласса UIView.

Кто-нибудь использовал NSNotificationCenter из подкласса UIView успешно? Я пробовал точки останова и NSLogs, но мой @selector никогда не вызывается.

EDIT- Вид, созданный с помощью loadNibNamed: и initWithCoder: не был реализован в классе. Регистрация для уведомления внутри initWithCoder: отлично работает.

+0

Я уже использовал NSNotificationCenter с подклассом UIView. Когда вы создаете экземпляр подкласса UIView, вы вызываете 'init' или' initWithFrame'? – hgwhittle

+1

Не могли бы вы опубликовать код (ваш '-init' переопределить, константы уведомлений и метод вашего обработчика), которые вы используете? – Tim

ответ

5

Убедитесь, что выбранный вами метод инициализации вызван. Установка точки прерывания на месте, которое вы регистрируете для уведомления, позволит вам увидеть, попало ли оно или нет. Иногда, когда для класса существует несколько методов init, не все из них будут вызваны в зависимости от того, как он инициализируется. Например, UIViewController вызовет другой метод init, если вы создадите экземпляр программно, и если вы получите один из раскадровки.

+0

Это тоже моя мысль. Готов поспорить, что '-initWithCoder:' получает вызов вместо '-init', если представление происходит от ниба. –

+0

Джефф прав, представление загружалось через loadNibNamed: и не было метода initWithCoder:. Был введен метод, позволяющий настроить представление после инициализации, когда я регистрировался для уведомлений безуспешно. Регистрация для уведомлений внутри initWithCoder: отлично работает! –

+1

Поскольку мой ответ был полезным, не могли бы вы принять его как правильный ответ? – Gavin

2

UIView Подкатегории и NSNotificationCenter.

Скорее всего, вы не зарегистрировали свой экземпляр в качестве наблюдателя или он не зарегистрирован до отправки уведомления.

Убедитесь, что вы фактически регистрируете UIView, установив точку останова в месте добавления наблюдателя. Также установите точку останова при удалении наблюдателя (dealloc?), Чтобы убедиться, что представление все еще существует. Затем запустите приложение и вызовите уведомление.

Смежные вопросы