2011-08-23 51 views
2

在所有的教程或例子,我覺得,他們表現出一個冒號的選擇器名稱(getCurrentData:)後,像這樣:2約NSNotification中心快速問答

[[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之外使用它時很好。有沒有辦法做到我想要的?

回答

3

首先,最重要的例子假設你是路過的通知方法。例如:

- (void)respondToNotification:(NSNotification *); 

這將表示爲:

@selector(respondToNotification:) 

如果你刪除了此說法,這將是

@selector(respondToNotification) 

至於第二項,你不能在指定參數那種方式。您需要構建您的方法,使其以接收通知爲參數的方式,然後您可以檢查通知並調用另一種方法來執行您需要的任何操作。

1

如果最後有一個冒號,那麼它需要一個參數。你不會在@selector調用中傳遞任何東西。你的第一個例子是正確的,你的getCurrentData:方法應該看起來像這樣。

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

對於每一個你的選擇是多麼的參數需要看到冒號,例如既@selector(aMethod:secondArg:thirdArg:)@selector(aMethod:::)有不同的簽名,但都將採取3個參數。

2

NSNotificationCenter發送通知(通過您指定的選擇 - 例如getCurrentData:)時,它將通過NSNotification的實例,因此您的方法必須接受一個實例的單個參數。

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

+0

您「必須」不是,您「應該」。必須暗示它不會編譯,它會這樣做。應該暗示,如果你正在做另一種方式,你做錯了......這是真的。爲你+1:D – Kheldar

+1

它可以編譯,但從上面鏈接的文檔:「指定接收方發送notification的消息的選擇器Observer將通知發佈通知給它。notificationSelector指定的方法必須有且只有一個參數(NSNotification的一個實例)「。 +1讚賞,雖然:) – marramgrass

2

第一個問題的答案是在Objective C中,冒號是函數名稱的一部分。如果你省略了它,你可以引用一個不需要任何參數的函數。然而,通知的方法總是與所謂的(並因此必須接受)一個參數:通知對象:

這裏是NSNotificationCenter Class Reference的摘錄:

「由notificationSelector中指定的方法必須有一個且只有一個參數(NSNotification的一個實例)「

0

你正在試圖添加一個觀察者併發送消息在相同的代碼中,它不會這樣工作。 您聲明這個方法用於響應事件,如[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMethod :) name:@「behaviorName」object:nil];

然後它會在事件發生時調用,並且可以通過object參數傳遞給它一個特殊的對象來處理它。然而,冒號後面應該傳遞一個特殊事件封裝對象(顯然是NSNotification),請參閱文檔,您應該爲其設計myMethod:方法。如果您在方法代碼中省略了該對象,則嘗試調用它失敗是有意義的,因爲您調用的是另一種方法,實際上是一種過載:p