/ / Прийміть обидва UIButtons та UIView як параметри методу - aim-c, ios, xcode

Прийняти як UIBoutons, так і UIView як параметри для методу - objective-c, ios, xcode

Як я можу записати функцію, яка буде приймати як параметр UIView або UIButton.

Наприклад, скажімо, що я хотів закруглити кути Перегляду / Кнопки:

[self roundCorners:x]

Як я можу зробити так, щоб прийняти як об'єкт UIButton, так і об’єкт UIView як x?

Першими моїми думками було використання id або NSObject, але я не думаю, що це правильно:

-(void)roundCorners:(id)objectToRound;

Вибачте за запитання новачка; Я все ще зависаю цього. Дякую!

Відповіді:

8 для відповіді № 1

UIButton є підкласом UIView, тож ваш метод візьме або один, якщо ви заявите це таким чином:

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

1 для відповіді № 2

Коротка відповідь:

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: яку ви можете використовувати для визначення того, з чим маєте справу. Я зробив це на крок далі, визначивши кілька допоміжних макросів, які спрощують подібні завдання, які часом є досить трудомісткими.

Якщо ви подивіться на мою відповідь це питання... ви побачите вихідний код і приклад використання цих макросів. Я часто використовую один з таких макросів (asClass), що поєднує в собі a isKindOfClass: тест, пов’язаний з типом, поданим для класу, на який тестується.

Ви можете кодувати таку річ довгою рукою, проте я вважаю, що вона створює більш читабельний код для використання asClass макрос. Простіше кажучи asClass(myView,UIButton) буде вирішено до нуля або до посилання на тип myView як UIButton - якщо це не UIButton, він буде вирішений до нуля.

Я змінив фрагмент з цієї публікації, щоб відповідати вашому питанню:

- (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

}

}

Я сподіваюсь, це допоможе.

Якщо вам подобається ця відповідь, будь ласка, проголосуйте її. Якщо ти хочеш відповідь на моє оригінальне запитання де живе код, проголосуйте також :-)


0 для відповіді № 3

Те, як ви це зробите, має працювати добре, id прийму майже все.