2010-09-02 93 views
4

我不断看到手动遍历UIView中某个类型的所有子视图的示例。例如,如果你想有一个键盘之外的点击取消键盘无论哪个字段处于活动状态,可能会:获取UIView类型

-(IBAction)backgroundClick:(id)sender 
{ 
    [myTextField resignFirstResponder]; 
    [myOtherTextField resignFirstResponder]; 
    // ... repeat for each of my zillion text fields. 
} 

取而代之的是这样的:

for(UIView *v in self.view.subviews) 
    if(v.hasKeyboard) // or something like java's instanceof 
     [v resignFirstResponder]; 

虽然改进的具体(例如现在发现哪一个是第一响应者),我对此表示赞赏,我对一般情况更感兴趣。

回答

6

你不能这样做

if([v isMemberOfClass:[UITextField class]]){
[v resignFirstResponder];
}

+2

谢谢!我可以在几个地方使用它!对于文本字段编辑的特定情况,我最终还发现你可以[self.view endEditing:YES]而不是迭代。 – 2010-09-02 14:10:41

2

或者,您可以通过迭代意见与

if([v respondsToSelector:@selector(isFirstResponder)] && [v isFirstResponder]) 
{ 
    [v resignFirstResponder]; 
    break; 
} 

这样只会调用resignFirstResponder对当前第一个响应并在当前的第一响应者被发现将停止。它将在UITextFields,UITextViews等以及任何未来的文本编辑视图上工作(假设它们继续实现响应方法)。

对于更一般的情况下,你可以使用

if([v isKindOfClass:UITextField.class]) 
{ 
    [v resignFirstResponder]; 
} 

对于一般键盘解雇首先是首选,因为所有你感兴趣的是键盘。该对象声称它将处理消息(方法调用),所以您不必真正关心它是什么类型。如果你确实需要确定它是一个UITextField,那么第二个选项是首选。