将任意控制,功能
问题描述:
的说法我想打一个共同的功能,这需要一个控制作为参数(如的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]];
}
这可能吗?
答
你也可以去这样
- (void) myFunction : (id) control
{
if([control isKindOfClass:[UITextField class]]){
// Your textfield condition
}
}
答
UIControl
是UITextField
,UIButton
和其他控件超类,所以这是你想要什么:
- (void) myFunction:(UIControl *) control
答
你应该通过UIControl
,因为它是为控制超类。
然后在您的代码中,您应该使用像respondsToSelector:
这样的方法来确定传入的控件是否可以执行您需要的操作。
您也可以使用isKindOfClass:
或isMemberOfClass
来检查其类别类型。
一旦你知道哪个对象正在处理,你可以键入它转换,以节省一些打字,并移除任何有关警告不应对选择,像这样:
// decided that it's a UITextField after using `respondsToSelector:` or `isKindOfClass:`
UITextField *aTextField = (UITextField *)control;
这种方法被称为“鸭子打字” - 因为它类似于说“如果它像鸭子走路,听起来像鸭子,它可能会成为一只鸭子”。
答
是的,这是可能的。你可以通过UIView作为参数,如下所示。
- (void) myFunction:(UIView*)customView{
if([customView isKindOfClass:[UIImageView class]]){
// This is UIImageview
}
}
希望这个帮助。
答
使用通用的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]];
}
}