2011-04-12 69 views
2

這裏是東西..添加觀察者時是否需要接收NSNotification?

每次我看到網絡上對相關的iphone爲例 - iPad的開發,我看到每一個控制器自身註冊爲一個通知時間,回調的方法是這樣的:

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

與按鍵操作一樣..總喜歡:

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

我只是做了一些測試,該方法使用或不使用參數反正叫。 這真的有必要嗎?是什麼原因?

謝謝!!!

+1

是否有某些原因你*不想包含它們?打字太多? – 2011-04-12 06:33:31

回答

0

根據蘋果文件。 iOS中的按鈕接收器可以是 - (void)動作, - (void)動作:(id)發送者。通知也可以有一個參數NSNotification或沒有參數。這取決於你的需求。

例如,我需要通過通知傳輸UIImage,因此我將UIImage添加到NSNotification的userInfo字典中。與發件人一樣,如果我需要發件人的某些屬性,那麼我將添加(id)發件人作爲參數。通常,我喜歡爲 - (id)發件人或NSNotification添加這些參數。如果我需要來自通知或發件人的一些信息,那麼我不需要更改原始方法,因爲它們已經有發送者或通知對象來獲取我需要的東西。

更新 必須添加NSNotification參數。 The reference document link

+0

通知也可以有一個參數NSNotification或沒有參數。請鏈接到說這個的文檔,因爲我的文檔沒有說任何這樣的事情。 – 2011-04-12 06:17:06

+0

對不起,我提供了錯誤信息。我更新我的文章,並給出文檔鏈接。並感謝您的糾正。 :) – AechoLiu 2011-04-12 07:57:31

1

當我發現我可以在沒有任何參數的情況下調用這些方法時,我只做了這個。它在大多數情況下工作正常,但在某些情況下,它顯示NSInvalidArgumentException。爲了安全起見,最好提一提這些論點。

在此處,不使用參數作出的應用程序崩潰的例子:

MultipleControllers in one view

3

NSNotificationCenter doc

notificationSelector
選擇器,用於指定所述接收器發送notificationObserver消息以通知其發送通知。由通知選擇器指定的方法必須有且只有一個參數(NSNotification的一個實例)。

[重點煤礦]

您必須提供正確的簽名選擇;如果你不這樣做,它可能會起作用,但它可能會在你不想要的時候停止工作。

您可能想要獲取通知的原因是,您可以以userInfo字典的形式傳遞信息,您可以使用notificationWithName:object:userInfo:發佈通知時指定。您可以在調用方法時忽略參數,但參數必須位於方法簽名中。

至於按鍵和自己的行爲,在docs說,你可以有三種簽名一個*:

UIKit框架允許三種不同形式的行動選擇的:
- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event

IBAction返回類型相當於void(沒有返回值),除了它出現在頭文件中的方法中允許Interface Builder知道該方法是作爲一個動作使用的,因此您可以連接控件。

想要獲得按鈕(或其他控件)的原因與通知類似。如果你的界面有很多按鈕,其中一些按鈕(例如在表格視圖中)連接到同一個動作,你可能需要通過按下按鈕的標識區分你做的確切的事情。


*:爲了完整起見,我想提一提,這是在Mac上的情況;在那裏,動作方法必須的形式爲:- (IBAction)action:(id)sender

相關問題