2012-01-31 63 views
2

我对UITextView s有点怀疑。我用它来把UITextField S,并通过与忠实的老攻外卸下键盘:如何通过点击外部来解除UITextView?

-(void)touchesEnded: (NSSet *)touches withEvent: (UIEvent *)event { 
for (UIView* view in self.view.subviews) { 
    if ([view isKindOfClass:[UITextField class]]) 
     [view resignFirstResponder]; 
} 
} 

我有这样的UITextView这是对我的看法设置(实际上是self.myTV,要准确),而我呢以下

-(void)touchesEnded: (NSSet *)touches withEvent: (UIEvent *)event { 
for (UIView* view in self.view.subviews) { 
    if ([view isKindOfClass:[UITextView class]]) 
     [view resignFirstResponder]; 
} 
} 

同上,保存为不同类...

那么它似乎并没有工作。任何人都有一个建议?

回答

2

问题是根据您的应用程序的子视图层次结构,UITextView不是FirstResponder。

我建议你对UIView进行分类以找到第一个响应者,如下所示: UIView上的这一类,它调用UIWindow和第一响应者的踪迹。

@implementation UIView (FindAndResignFirstResponder) 
- (BOOL)findAndResignFirstResponder 
{ 
    if (self.isFirstResponder) { 
     [self resignFirstResponder]; 
     return YES;  
    } 
    for (UIView *subView in self.subviews) { 
     if ([subView findAndResignFirstResponder]) 
      return YES; 
    } 
    return NO; 
} 
@end 
+0

分类UIView看起来有点矫枉过正,然后我的应用程序中的每一个UIView也有这种行为。我会害怕在某个地方发生某些事情,开始行为不端并花费很长时间来追溯它。 – Kheldar 2012-01-31 14:29:25

+0

如果没有其他人有更好的解决方案,我可能会结束,接受你的答案,尽管我用它表达了我的问题,但看起来在技术上是正确的。我最后做的是在viewWillDisappear方法中提交textview的内容,并将所述视图放在navigationController中(所以我得到一个按钮以返回到我的应用程序的正常流程)。无论如何,它比我最初想到的要好得多。我想,如果编码感觉不自然,那是因为我没有正确地使用UI,往往是这样;) – Kheldar 2012-01-31 15:58:03

4

一个简单的方法辞职第一响应任何子视图是当前的第一响应者是:

[self.view endEditing:NO]; 

或者如果你想迫使第一响应者不问它首先辞职:

[self.view endEditing:YES]; 
相关问题