2011-05-13 78 views
3

我想了解的Objective-C爲iPhone開發的經歷有關行動的例子,雖然我經常看到的東西,如:爲什麼(ID)發送的,而不是(的UIButton *)寄件人

- (IBAction)sliderMoved:(id)sender 
{ 
    UISlider *aSlider = (UISlider *)sender; 
    //rest of code goes here... 
} 

是什麼接受類型(id)然後立即將其轉換爲(UISlider *)的目的。爲什麼不只是有以下幾點:

- (IBAction)sliderMoved:(UISlider *)aSlider; 
{ 
    //rest of code goes here... 
} 

有沒有技術原因,或者它只是約定,或爲了可讀性?

由於提前,

  • 蒂莫

回答

6

我認爲這是一個約定,源於事實並不總是1:1的UIControl到IBAction的映射。例如,您可以將UISwitch,UIButton和UITextField全部映射到- (IBAction)syncUI:(id)sender;方法。在這種情況下,不可能指定類型。

我承認這只是我自己的心理理由,並且如果您可以的話,確實沒有什麼能夠阻止您更加明確地表達發件人的類型。我通常是。

0

id是抽象的數據類型。如果你的方法可以從多個地方,另一個對象,通過一個按鈕等被調用,那麼你可能並不總是知道什麼類型的對象正在發送方法調用。我認爲這主要是約定,如果你要輪詢發件人的數據,你必須知道它可以響應什麼方法(如果不是,你可以問respondersToSelector :)。

2

IBActions通常是通用的,並且可以由任何類別觸發,因此是id類型。如果你需要在你的方法中使用sender變量,那麼顯然你關心的是sender這個類,所以你應該改變方法簽名以反映它。

3

實際上,如果您願意,您可以指定發件人爲UIButton*,並且您完全可以確定該行爲永遠不會被任何其他類型的對象觸發。如果行動取決於發件人是特定類型,那甚至可能是適當的。但是,通常情況下,發件人的類型與控制器無關,並將其指定爲id可讓您靈活地更改視圖而無需修改控制器。

即使您知道在應用程序中始終使用相應操作中的按鈕,您也可能需要這種靈活性的一個原因是它使單元測試更容易。

相關問題