簡體   English   中英

添加觀察者時是否有必要收到NSNotification?

[英]Is it necessary to receive a NSNotification when adding an observer?

這是東西。

每當我看到一個與網絡相關的iPhone的示例-ipad dev時,我都會看到每次控制器為通知注冊其自身時,回調方法都類似於:

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

與按鈕動作相同..總是喜歡:

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

我只是做了一些測試,無論有沒有參數,該方法都會被調用。 這真的有必要嗎? 是什么原因?

謝謝 !!!

NSNotificationCenter doc中

notificationSelector
選擇器,它指定接收方發送通知消息的消息,通知服務器將通知發布通知給它。 notificationSelector指定的方法必須只有一個參數( NSNotification一個實例)。

[強調我的]

您必須為選擇器提供正確的簽名; 如果您不這樣做,它可能會起作用,但可能只是在您不希望它停止時才停止工作。

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

至於按鈕及其動作, 文檔說您可以擁有以下三個簽名之一:

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

IBAction返回類型等效於void (沒有返回值),除了它在標頭中的方法中存在之外,它使Interface Builder知道該方法旨在用作操作,以便您可以掛接控件。

想要獲取按鈕(或其他控件)的原因與通知類似。 如果您的界面中有許多按鈕,其中一些按鈕(例如在表格視圖中)連接到同一操作,則可能需要通過按按鈕的標識來區分您所做的確切操作。


*:出於完整性考慮,我想提一下Mac 並非如此; 在那里,操作方法必須采用以下形式- (IBAction)action:(id)sender

當我發現可以不帶任何參數地調用這些方法時,我只是這樣做。 在大多數情況下,它運行良好,但在某些情況下,它顯示了NSInvalidArgumentException 最好只是出於安全考慮而提及這些論點。

這是一個不使用參數導致應用程序崩潰的示例:

在一個視圖中使用MultipleControllers

根據蘋果文件。 iOS中按鈕的接收方可以是-(void)action,-(void)action:(id)sender。 並且通知還可以具有參數NSNotification或沒有參數。 這取決於您的需求。

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

更新必須添加NSNotification參數。 參考文件鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM