2012-12-14 92 views
0

可能重複:
Objective C: what is a 「(id) sender」?理解(ID)發送

我有以下一些問題:

- (IBAction)leftButtonPressed:(id)sender 
{ 
    UIButton *button = (UIButton*)sender; 
    _label.text = button.titleLabel.text; 
} 

這到底是什麼(UIButton)*sender嗎?我的意思是尤其是(UIButton *)與*。是否類似於UIButton *myButton

據我瞭解,它是按鈕被按下的某種指針,但爲什麼?爲什麼我不能只寫

_label.text = sender.titleLabel.text; 

因爲它「是」的按鈕?我怎麼知道可以發送什麼?我的意思是我可以寫些類似於:

-(void)leftButtonPressed:(color)sender {...} 

爲了傳遞按鈕的顏色?

+0

請參閱此http://stackoverflow.com/a/5578158/716216 –

回答

2

(UIButton *)sender這是將您的id sender轉換爲UIButton。

是的,你可以寫-(void)leftButtonPressed:(color)sender {...},但顏色應該是一個有效的類的類型,它應該是指針像-(void)leftButtonPressed:(NSColor *)sender {...}

1

有時你會得到警告,如「incompatible pointer type ....」或「incompatible conversion..」等等......這些發生由於錯誤的類型鑄造.. (id)是這樣的類型的腳輪誰可以處理類型轉換(這裏按鈕動作)...我希望你明白我的觀點。

1

你不能寫

_label.text = sender.titleLabel.text; 

因爲發送者ID類型和ID的對象不具有任何proerty爲titleLabel,所以你必須先類型轉換髮件人所以編譯器知道這是一個UIButton類型具有名爲titleLabel的屬性的對象。

現在如果你想直接用發送者,那麼你必須確保該方法只能獲得按鈕點擊觸發的事件,然後改變你的方法如下

- (IBAction)leftButtonPressed:(UIButton *)sender 

,那麼你可以直接使用

_label.text = sender.titleLabel.text;