Objective c 接受UIButtons和UIView作为方法的参数

Objective c 接受UIButtons和UIView作为方法的参数,objective-c,ios,xcode,Objective C,Ios,Xcode,如何编写将UIView或UIButton作为参数的函数 例如,假设我想绕过视图/按钮: [self roundCorners:x] 我如何使它同时接受UIButton对象或UIView对象作为x 我最初的想法是使用id或NSObject,但我不认为这是正确的: -(void)roundCorners:(id)objectToRound; 对于新手的问题,我很抱歉;我仍然掌握着这个窍门。 谢谢大家! 你这样做应该很好,id几乎可以接受任何东西。你这样做应该很好,id几乎可以接受任何东西。UIB

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

例如,假设我想绕过视图/按钮:

[self roundCorners:x]
我如何使它同时接受UIButton对象或UIView对象作为x

我最初的想法是使用id或NSObject,但我不认为这是正确的:

-(void)roundCorners:(id)objectToRound;
对于新手的问题,我很抱歉;我仍然掌握着这个窍门。
谢谢大家!

你这样做应该很好,
id
几乎可以接受任何东西。

你这样做应该很好,
id
几乎可以接受任何东西。

UIButton
UIView
的子类,因此如果你这样声明,你的方法将采用其中一种:

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

UIButton
UIView
的子类,因此如果您这样声明,您的方法将采用其中一种:

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

简短回答:

if ([view isKindOfClass:[UIButton class]]) {
    UIButton *button = (UIButton *) view;
    // do something funky with button


} else {
   // do something funky with view

}
详细答案:

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
),它结合了一个
isKindOfClass:
测试,该测试链接到要测试的类的类型转换

您可以长期编写这样的代码,但是我发现它创建了更可读的代码来使用
asClass
宏。简单地说,
aClass(myView,UIButton)
将解析为nil或将myView转换为UIButton的类型转换引用-如果它不是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

    }

}
我希望这有帮助


如果你喜欢这个答案,请投赞成票。如果您喜欢代码所在的位置,请也投票表决:-)

简短回答:

if ([view isKindOfClass:[UIButton class]]) {
    UIButton *button = (UIButton *) view;
    // do something funky with button


} else {
   // do something funky with view

}
详细答案:

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
),它结合了一个
isKindOfClass:
测试,该测试链接到要测试的类的类型转换

您可以长期编写这样的代码,但是我发现它创建了更可读的代码来使用
asClass
宏。简单地说,
aClass(myView,UIButton)
将解析为nil或将myView转换为UIButton的类型转换引用-如果它不是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

    }

}
我希望这有帮助


如果你喜欢这个答案,请投赞成票。如果您喜欢代码所在的位置,也可以投票表决:-)

但是如果我尝试使用objectToRound.bounds访问对象的边界,我会得到一个错误,上面说“在类型为“\u strong id'”的对象上找不到属性“bounds”@Jaden10,您应该将
id
转换为如下适当的指针类型:
((UIView*)objectToRound).bounds=…
。也就是说,更改rob mayoff提供的答案中的方法签名更容易。但是如果我尝试使用objectToRound.bounds访问对象的边界,我会得到一个错误,即“在类型为“\uu strong id'”的@Jaden10的对象上找不到属性“bounds”,您应该将
id
强制转换为如下相应的指针类型:
((UIView*)objectToRound).bounds=…
。也就是说,更改rob mayoff提供的答案中的方法签名更容易。