2010-01-21 36 views
0

在我正在閱讀的書中,作者以下列方式實現了滑塊的IBAction(請參見下面的V001)。在我看來,這似乎有點過於複雜,所以我重新考慮了代碼(V002)。我是否認爲sender是指向觸發事件的對象的指針?另外,在頭文件中發送發件人是否有任何缺點,而不是將其作爲發件人並將其轉換到方法體中?iPhone UISlider操作方法

V001

-(IBAction)sliderChange:(id)sender { 
    UISlider *slider = (UISlider *)sender; 
    int progressAsInt = (int)([slider value] + 0.5f); 
    NSString *newText = [[NSString alloc] initWithFormat:@"%d", progressAsInt]; 
    [sliderLabel setText:newText]; 
    [newText release];  
} 

V002

-(IBAction)sliderChange:(UISlider*)sender { 
    NSString *newText = [[NSString alloc] initWithFormat:@"%d",(int)[sender value]]; 
    [sliderLabel setText:newText]; 
    [newText release]; 
} 

加里

回答

3

ID的一種特殊類型,可以容納任何對象。細微之處在於你沒有明確的類型安全。你可以在任何對象上調用任何選擇器,如果它存在,它將被調用。

在V001中,執行[滑動條值]而不是[發送者值]使得更合乎邏輯的意義,我認爲這可能是您爲什麼首先重構,因爲它似乎沒有被調用。

在V002 [sender value]中檢索同一個UISlider的float屬性,但隱藏了一個事實,即您可能沒有獲得滑塊對象,並且它可能位於任何對象上。

這是一個風格和歧視問題。我在自己的代碼中非常勤奮,以確定哪個具體對象我試圖訪問選擇器,甚至會調用isKindOfClass,並驗證我正在調用正確的UISlider對象上的選擇器。爲了回答你的缺點問題:對象的類型不會像使用id時那樣被排除。

爲什麼?我想在同一個視圖上處理滑塊事件的多個滑塊,我不希望一個滑塊影響兩個數據,即使我想要以相同的方式處理它們。

+0

感謝您的意見。是否有任何通過命名變量「發件人」必須保持不變的約定,我可以將其更名爲「滑塊」以更好地表示正在使用的對象? – fuzzygoat 2010-01-21 15:29:32

+0

有點抓住了22。擁有(id)發件人在某種程度上是約定,以便您知道所調用的選擇器是針對setTarget的操作的處理程序,用於按鈕單擊/滑塊控件移動等。 – 2010-01-21 16:56:15

+0

非常感謝 – fuzzygoat 2010-01-21 17:59:52