传递任何控制作为函数的参数

时间:2012-03-28 11:47:18

标签: iphone objective-c function user-controls argument-passing

我想创建一个将控件作为参数的公共函数(如UITextField,UIButton等)

如果我喜欢这个,它的工作正常

- (void)  myFunction : (UITextField*) : control
{

}

//But I want to make it common for any control

- (void)  myFunction : (`I don't know what to write here`) : control
{
     //suppose if control is UITextField, I can set its font and its size.
     //something like this
    [control setFont:[UIFont fontWithName:@"Verdana" size:12]];
}

这可能吗?

5 个答案:

答案 0 :(得分:1)

你应该传递UIControl,因为它是控件的超类。

然后在您的代码中,您应该使用respondsToSelector:之类的方法来确定传入的控件是否可以执行您需要它执行的操作。

您也可以使用isKindOfClass:isMemberOfClass检查其类类型。

一旦你知道你正在处理哪个对象,你可以输入它来保存一些打字并删除任何关于不响应选择器的警告,如下所示:

// decided that it's a UITextField after using `respondsToSelector:` or `isKindOfClass:`
UITextField *aTextField = (UITextField *)control;

这种方法被称为“鸭子打字” - 因为它类似于“如果它像鸭子一样走路,听起来像鸭子,它可能是一只鸭子”。

答案 1 :(得分:1)

你也可以这样

- (void)  myFunction : (id) control
{
  if([control isKindOfClass:[UITextField class]]){
     // Your textfield condition
  }
}

答案 2 :(得分:0)

UIControlUITextFieldUIButton和其他控件的超类,所以这就是你想要的:

- (void) myFunction:(UIControl *) control

答案 3 :(得分:0)

是的,有可能。您可以将UIView作为参数传递,如下面的

- (void)  myFunction:(UIView*)customView{
   if([customView isKindOfClass:[UIImageView class]]){
     // This is UIImageview
  }
}

希望得到这个帮助。

答案 4 :(得分:0)

使用通用ID然后转换你的控件并询问它是否是UITextField(或......的子类)

   - (void)  myFunction : (id)  control
    {
         //suppose if control is UITextField, I can set its font and its size.
         //something like this
        (UITextField*)aText = (UITextField*)control;
        if ([aText.class isSubclassOfClass:[UITextField class]]) {
            [aText setFont:[UIFont fontWithName:@"Verdana" size:12]];
        }
    }