我想创建一个将控件作为参数的公共函数(如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]];
}
这可能吗?
答案 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)
UIControl
是UITextField
,UIButton
和其他控件的超类,所以这就是你想要的:
- (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]];
}
}