2012-01-19 2 views
1

Как написать функцию, которая будет использовать UIView или UIButton в качестве параметра.Принять как UIButtons, так и UIViews как параметры для метода

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

[self roundCorners:x] 

Как я мог сделать, что принимать как объект UIButton или объект UIView как х?

Мои первые мысли были использовать идентификатор или NSObject, но я не думаю, что это правильно:

-(void)roundCorners:(id)objectToRound; 

К сожалению для начинающего вопроса; Я все еще чувствую это. Спасибо!

ответ

8

UIButton подкласс UIView, так что ваш метод будет принимать либо один, если вы объявите это так:

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

} 

Подробный ответ:

Прежде всего, это обычно best, чтобы иметь конкретный метод обработки каждого класса объекта. Это значит, что вы можете разрешить компилятору потенциально передавать неправильный класс методу. Однако есть моменты, когда это не подходит или возможно.

UIView и UIButton оба являются потомками NSObject.

NSObject имеет метод isKindOfClass:, который вы можете использовать для определения того, с чем имеете дело. Я сделал еще один шаг, выделив несколько вспомогательных макросов, которые упрощают такие задачи, которые иногда довольно трудоемкие.

Если вы посмотрите на мой ответ this question ... вы увидите исходный код и пример использования этих макросов. Я часто использую один из этих макросов (asClass), который объединяет тест 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 

    } 

} 

Я надеюсь, что это помогает.

Если вам понравился этот ответ, пожалуйста, проголосуйте. Если вам нравится the answer to my original question, где код живет, проголосуйте тоже :-)

Смежные вопросы