Короткий ответ:
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, где код живет, проголосуйте тоже :-)
Но если я попытаюсь получить доступ к границам объекта, используя objectToRound.bounds, я получаю сообщение об ошибке «Ограничения свойства» не найдены на объекте типа '__strong id' " – jadengeller
@ Jaden10 Вам следует указывать' id' на соответствующий тип указателя следующим образом: '((UIView *) objectToRound) .bounds = ...'. Тем не менее, легче изменить сигнатуру метода, как в ответе, предоставленном _rob mayoff_. – Costique