2 сообщения о Центре NSNotification - PullRequest
2 голосов
/ 23 августа 2011

Во всех учебных пособиях или примерах, которые я нахожу, они показывают двоеточие после имени селектора (getCurrentData:), например:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getCurrentData:) name:@"mapsReceived" object:nil ];

Поскольку в примерах нет ничего после этого двоеточия, я предполагаю, что указанный метод не принимает никаких аргументов. И мой тоже нет, но когда я использую приведенный выше синтаксис, мое приложение вылетает и говорит unrecognized selector sent to instance Я удаляю двоеточие, и оно работает. Так почему же все примеры показывают двоеточие?

Во-вторых, если я использовал селектор, требующий аргумента, как я могу это сделать? Если я сделаю это:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(createButtons:@"ten grand";) name:@"mapsReceived" object:nil ];

Он даже не скомпилируется; Я получаю тонны ошибок, пока не удалю текстовую строку и двоеточие. Тем не менее, я могу вызвать этот метод со строкой, просто отлично, когда он используется вне NSNotification. Есть ли способ сделать то, что я хочу здесь?

Ответы [ 5 ]

3 голосов
/ 23 августа 2011

Во-первых, в большинстве случаев предполагается, что вы передаете уведомление методу. Например:

- (void)respondToNotification:(NSNotification *);

Это будет представлено как:

@selector(respondToNotification:)

Если вы удалите этот аргумент, это будет

@selector(respondToNotification)

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

2 голосов
/ 23 августа 2011

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

Вот выдержка из справочника классов NSNotificationCenter :

"У метода, указанного в уведомлении, должен быть один и только один аргумент (экземпляр NSNotification)"

2 голосов
/ 23 августа 2011

Когда NSNotificationCenter отправляет уведомление (через указанный селектор, например, getCurrentData:), он передает экземпляр NSNotification, поэтому ваш метод должен принять один аргумент, который является таким экземпляром.

См. http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html

1 голос
/ 23 августа 2011

Если в конце есть двоеточие, тогда он принимает параметр.Вы ничего не передаете в вызове @selector.Ваш первый пример верен, и ваш метод getCurrentData: должен выглядеть следующим образом.

-(void)getCurrentData:(NSNotification*)note
{
     //Implementation
}

Для каждого двоеточия, которое вы видите в селекторе, это то, какие параметры он принимает, например, @selector(aMethod:secondArg:thirdArg:) и @selector(aMethod:::)имеют разные подписи, но оба будут принимать 3 аргумента.

0 голосов
/ 23 августа 2011

Вы пытаетесь добавить наблюдателя и отправить сообщение с тем же кодом, это не работает.Вы заявляете, что ЭТОТ метод используется для реагирования на событие, как в [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (myMethod :) name: @ "поведениеName" объект: nil];

Тогда он будетвызываться, когда происходит событие, и вы можете передать ему специальный объект через параметр объекта для работы.Однако за двоеточием предполагается передать специальный объект инкапсуляции событий (очевидно, NSNotification), см. Документацию, для которой вы должны разработать метод myMethod:.Если вы пропустили объект в коде вашего метода, то имеет смысл пытаться вызвать его неудачно, так как вы вызываете другой метод, по сути перегрузка: p

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