接受UIButtons和UIViews作为方法的参数

时间:2012-01-19 04:28:09

标签: objective-c ios xcode

如何编写一个将UIView或UIButton作为参数的函数。

例如,假设我想要对视图/按钮进行圆角处理:

[self roundCorners:x]

我怎样才能将UIButton对象或UIView对象同时接受为x?

我的第一个想法是使用id或NSObject,但我不认为这是正确的:

-(void)roundCorners:(id)objectToRound;

抱歉新手问题;我仍然掌握着这个问题。 谢谢!

3 个答案:

答案 0 :(得分:8)

UIButtonUIView的子类,因此如果您以这种方式声明,您的方法将采用其中一个:

- (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几乎可以接受任何事情。