Нужно ли получать NSNotification при добавлении наблюдателя? - PullRequest
2 голосов
/ 12 апреля 2011

Вот в чем дело ..

Каждый раз, когда я вижу пример, связанный с Интернетом iphone - ipad dev, я вижу, что каждый раз, когда контроллер регистрируется для уведомления, метод обратного вызова выглядит так:

-(void)mymethod:(NSNotification *)notification {
    //Bla Bla
}

то же самое с действиями кнопок .. всегда как:

- (void)actionmethod:(id)sender {
     //Bla Bla
}

Я просто делаю несколько тестов, и метод в любом случае вызывается с параметром или без него. Это действительно необходимо? По какой причине?

Спасибо тебе !!!

Ответы [ 3 ]

3 голосов
/ 12 апреля 2011

Из NSNotificationCenter Документ :

notificationSelector
Селектор, который указывает сообщение, которое получатель отправляет messagesObserver , чтобы уведомить его о публикации уведомления. Метод, указанный в messagesSelector , должен иметь один и только один аргумент (экземпляр NSNotification).

[Акцент мой.]

Вы должны предоставить селектору правильную подпись; если вы этого не сделаете, это может сработать, но может перестать работать только тогда, когда вы этого не хотите.

Причина, по которой вы можете захотеть получить уведомление, заключается в том, что вы можете передавать информацию в форме словаря userInfo, который вы можете указать, когда вы сами публикуете уведомление, используя notificationWithName:object:userInfo:. Вы можете игнорировать аргумент при вызове метода, но параметр должен присутствовать в сигнатуре метода.

Что касается кнопок и их действий, документы говорят, что вы можете иметь одну из трех подписей *:

фреймворк UIKit допускает три различных формы селектора действий:
- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event

Возвращаемый тип IBAction эквивалентен void (возвращаемое значение отсутствует), за исключением того, что его присутствие в методе в вашем заголовке позволяет Интерфейсному Разработчику знать, что метод предназначен как действие, так что вы можно подключить элементы управления.

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


*: Для полноты картины хочу отметить, что это , а не случай на Mac; там метод действия должен иметь форму: - (IBAction)action:(id)sender.

1 голос
/ 12 апреля 2011

Когда я узнал, что могу вызывать эти методы без каких-либо аргументов, я сделал только это. В большинстве случаев он работал нормально, но в некоторых случаях показывал NSInvalidArgumentException. Лучше упомянуть эти аргументы, чтобы быть в безопасности.

Вот пример, где неиспользование аргументов приводило к падению приложения:

Несколько контроллеров в одном представлении

0 голосов
/ 12 апреля 2011

Согласно яблочному документу. Получатель кнопки в iOS может быть - (void) действие, - (void) действие: (id) отправитель. И уведомление также может иметь параметр NSNotification или нет параметра. Это зависит от ваших потребностей.

Например, мне нужно передать UIImage по уведомлению, поэтому я добавлю UIImage в словарь userInfo NSNotification. Так же, как отправитель, если мне понадобятся некоторые свойства от отправителя, я добавлю (id) отправителя в качестве параметра. Как правило, я хотел бы добавить эти параметры для - (id) отправителя или NSNotification. Если мне нужна некоторая информация из уведомления или отправителя, мне не нужно менять исходные методы, потому что у них уже есть отправитель или объекты уведомления, чтобы получить то, что мне нужно.

Обновление Параметр NSNotification должен быть добавлен. Ссылка на справочный документ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...