2011-04-07 57 views
33

在一些IBAction我看到:目的C:什麼是「(id)發送者」?

- (IBAction)pushButton:(id)sender; 

(id)sender我什麼時候使用它?

+3

注意:您可以[格式線爲代碼(http://meta.stackexchange.com/questions/22186/how-do-i- format-my-code-blocks),通過縮進它們四個空格,相比之下,前導'-'會給你一個list元素,就像你在que中看到的那樣Stion的。編輯器工具欄中的「{}」按鈕可以爲您做到這一點。編輯你的問題並嘗試一下。單擊編輯器工具欄中的橙色問號以獲取更多信息和格式化提示。 – outis 2011-04-07 08:35:05

回答

33
(id)sender is the object which sent the message to that selector. 

代碼示例:

- (IBAction)submitButton:(id)sender { 
    UIButton *button = (UIButton *)sender; 
    [button setEnabled:NO]; 
    [button setTitle:@"foo" forState:UIControlStateDisabled]; 
} 
+0

好的,但你可以使用這個ID發件人只用於「按鈕」;如果我應該修改一個文本框,那麼這是怎麼回事? – CrazyDev 2011-04-07 09:04:25

+0

@blackguardian:你的意思是你想將id轉換爲UITextField,然後改變它的文本? – 2011-04-07 09:38:13

+0

是............ – CrazyDev 2011-04-07 09:47:26

62

馬特加洛韋描述的(id) sender的含義在行動上iPhone開發SDK論壇正是如此:

(ID)發送器是發送消息到該選擇器的對象。這就像在你傳遞給函數的控制委託功能等

你會使用這個,如果你有2個對象,其被調用一個選擇,你希望他們之間的區別。當然,你可以使用兩種不同的函數,但它通常更簡潔,重用代碼的次數更少。

查看 UIControl Class Reference瞭解更多詳情。


爲一個例子,的UITextField具有當的UITextField編輯結束觸發一個委託:

-(IBAction) editingEnded:(id) sender { 
    // the cast goes here, lets assume there's more than one UITextfield 
    // in this Owner and you want to know which one of them has triggered 
    // the "editingEnded" delegate 
    UITextField *textField= (UITextField*)sender; 
    if(textfield == iAmTheLastTextField) 
    { 
    // for example login now. 
    [self login]; 
    } 
} 
+13

這個答案實際上比被接受的答案要好... – 2012-05-13 19:48:57

4

「發送者」是變量的名稱。

「(ID)」是指該變量的類型是「ID」,即表示「任何對象」的(你可以看到它的對象層次結構的頂部,如果你想

的名稱該方法是按鈕:和要求任何種1個參數

此方法將被鏈接到一個按鈕上的UI此UI的代表將接收該呼叫,並且必須具有的UIButton的參考。有時候你不需要它,有時你需要訪問那個UIButton來改變他的屬性,例如

1

它是Cocoa的target-action mechanism的一部分,它是一種物體可以相互通信的方式。在響應於事件(例如,鼠標點擊),一個對象(通常是某種控制)將消息發送給另一個對象。發送方被調用,以及,「發送者」,接收方是「目標」和消息是「動作」。

您可以使用它在目標的消息處理程序,以獲取有關發送方的動作的附加信息。

+0

如果有一個例子正是如何獲得附加信息,這將更有用:) – 2013-10-19 19:39:07

+0

@GForty:不可能,因爲'id'是一個通用對象。一般來說,它是一個NSObject,但類型不再那麼確定。如果你需要額外的信息,你必須知道對象實現了什麼接口,並向它發送適當的消息(如在gontnull的示例中,發送者被假定爲一個按鈕)。 – outis 2013-10-20 02:31:37

0

我從Rabskatran教訓。但我wouldlike糾正說:「發件人」是變量的名稱的唯一部分。它應該是(來自Apple文檔 - https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html):

「動作消息調用的方法具有特定的簽名:單個參數持有對啓動動作消息的對象的引用;按照慣例,此參數的名稱是發件人。例如,

  • (void)moveToEndOfLine:(id)sender; //從NSResponder.h」

所以它是一個參數!

相關問題