我該如何編寫一個函數,它將UIView或UIButton作爲參數。接受UIButtons和UIViews作爲參數的方法
例如,假設我想圓邊角查看/按鈕:
我怎麼能作出這樣的同時接受一個UIButton對象或一個UIView對象爲x?
我的第一個想法是使用ID或NSObject的,但我不認爲這是正確的:
-(void)roundCorners:(id)objectToRound;
很抱歉的新手問題;我仍然掌握着這一點。 謝謝!
我該如何編寫一個函數,它將UIView或UIButton作爲參數。接受UIButtons和UIViews作爲參數的方法
例如,假設我想圓邊角查看/按鈕:
我怎麼能作出這樣的同時接受一個UIButton對象或一個UIView對象爲x?
我的第一個想法是使用ID或NSObject的,但我不認爲這是正確的:
-(void)roundCorners:(id)objectToRound;
很抱歉的新手問題;我仍然掌握着這一點。 謝謝!
UIButton
是UIView
一個子類,所以如果你這樣聲明它的方法將採取任何一個:
- (void)roundCorners:(UIView *)objectToRound;
你這樣做的方式應該工作得很好,id
幾乎可以接受任何事情。
簡短的回答:
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,請將其投票:-)
但是,如果我嘗試訪問使用objectToRound.bounds的對象的邊界,我得到一個錯誤,說「屬性的邊界」沒有找到類型的對象'__strong id'' – jadengeller
@ Jaden10您應該將'id'強制轉換爲適當的指針類型,如下所示:'((UIView *)objectToRound).bounds = ...'。也就是說,更改方法簽名更容易,就像_rob mayoff_提供的答案一樣。 – Costique