如何编写一个将UIView或UIButton作为参数的函数。
例如,假设我想要对视图/按钮进行圆角处理:
[self roundCorners:x]
我怎样才能将UIButton对象或UIView对象同时接受为x?
我的第一个想法是使用id或NSObject,但我不认为这是正确的:
-(void)roundCorners:(id)objectToRound;
抱歉新手问题;我仍然掌握着这个问题。 谢谢!
答案 0 :(得分:8)
UIButton
是UIView
的子类,因此如果您以这种方式声明,您的方法将采用其中一个:
- (void)roundCorners:(UIView *)objectToRound;
答案 1 :(得分: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,请将其投票: - )
答案 2 :(得分:0)
你这样做的方式应该很好,id
几乎可以接受任何事情。