2012-01-19 72 views
1

我該如何編寫一個函數,它將UIView或UIButton作爲參數。接受UIButtons和UIViews作爲參數的方法

例如,假設我想圓邊角查看/按鈕:

​​

我怎麼能作出這樣的同時接受一個UIButton對象或一個UIView對象爲x?

我的第一個想法是使用ID或NSObject的,但我不認爲這是正確的:

-(void)roundCorners:(id)objectToRound; 

很抱歉的新手問題;我仍然掌握着這一點。 謝謝!

回答

8

UIButtonUIView一個子類,所以如果你這樣聲明它的方法將採取任何一個:

- (void)roundCorners:(UIView *)objectToRound; 
0

你這樣做的方式應該工作得很好,id幾乎可以接受任何事情。

+0

但是,如果我嘗試訪問使用objectToRound.bounds的對象的邊界,我得到一個錯誤,說「屬性的邊界」沒有找到類型的對象'__strong id'' – jadengeller

+0

@ Jaden10您應該將'id'強制轉換爲適當的指針類型,如下所示:'((UIView *)objectToRound).bounds = ...'。也就是說,更改方法簽名更容易,就像_rob mayoff_提供的答案一樣。 – Costique

1

簡短的回答:

if ([view isKindOfClass:[UIButton class]]) { 
    UIButton *button = (UIButton *) view; 
    // do something funky with button 


} else { 
    // do something funky with view 

} 

詳細的解答:

首先,它通常是最好的有一個特定的方法來處理每個類的對象。這是因爲您可以讓編譯器解決可能將錯誤的類傳遞給方法。然而,有些時候這不合適或不可行。

UIView和UIButton最終都是NSObject的後代。

NSObject有一個方法isKindOfClass:,您可以使用它來確定您正在處理的內容。我通過定義一些幫助宏來簡化這些類型的任務,這有​​時相當費力。

如果你看看我對this question的回答...你會看到源代碼,以及使用這些宏的例子。我經常使用這些宏之一(asClass),它將鏈接到類型轉換的isKindOfClass:測試合併到正在測試的類中。

您可以長時間編寫這樣的東西,但是我發現它使用asClass宏創建更多可讀代碼。簡單地說,asClass(myView,UIButton)將解析爲nil或作爲UIButton的類型強制轉換爲myView的引用 - 如果它不是UIButton,則將解析爲nil。

我已經從後修改的片段,以適應你的問題:

- (void)myMethod:(UIView*)view{ 

    UIButton *button = asClass(view, UIButton); 

    if (button) { 
     // do something funky with button 

    } else { 
     // do something funky with view 

    } 

} 

實現代碼長手,(不含宏)它看起來這樣的:

- (void)myMethod:(UIView*)view{ 


    if ([view isKindOfClass:[UIButton class]]) { 
     UIButton *button = (UIButton *) view; 
     // do something funky with button 


    } else { 
     // do something funky with view 

    } 

} 

正如你所看到的,這並不是太多額外的代碼,如果你不習慣使用宏來處理這樣的事情(有些人不是),那麼你可以選擇堅持第二個例子。

,如果你是舒服宏,並且能看到我採取的方法的優點,可考慮做它的這種第三條道路:

- (void)myMethod:(UIView*)view{ 

    UIButton *button; 

    if ((button = asClass(view, UIButton))) { 
     // do something funky with button 

    } else { 
     // do something funky with view 

    } 

} 

我希望這有助於。

如果你喜歡這個答案,請投票。如果你喜歡代碼所在的the answer to my original question,請將其投票:-)

相關問題