如何通过点击外部来关闭 UITextView?

Posted

技术标签:

【中文标题】如何通过点击外部来关闭 UITextView?【英文标题】:How to dismiss an UITextView with tapping outside? 【发布时间】:2012-01-31 14:00:20 【问题描述】:

我对@9​​87654321@s 有点怀疑。我以前放UITextFields,和老铁们一起敲门把键盘拆掉:

-(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];


同上,不同类除外...

好吧,它似乎不起作用。有人有建议吗?

【问题讨论】:

【参考方案1】:

为当前是第一响应者的任何子视图退出第一响应者的简单方法是:

[self.view endEditing:NO];

或者如果你想强制第一响应者辞职而不先询问:

[self.view endEditing:YES];

【讨论】:

【参考方案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

【讨论】:

对 UIView 进行分类似乎有点矫枉过正,然后我的应用程序中的每个 UIView 也都有这种行为。我会害怕在某个地方有一些东西开始行为不端并需要很长时间才能追溯到它。 除非其他人有更好的解决方案,否则我可能最终会接受您的回答,尽管我表达了我的问题,但这在技术上似乎是正确的。我最后所做的是在 viewWillDisappear 方法中提交 textview 的内容,并将所述视图放在 navigationController 中(所以我得到一个按钮来返回我的应用程序的正常流程)。无论如何,它实际上感觉比我最初想到的要好。我想如果感觉编码不自然,那是因为我在 UI 方面做得不对,通常是 ;)

以上是关于如何通过点击外部来关闭 UITextView?的主要内容,如果未能解决你的问题,请参考以下文章

如何从外部源更新 uitextview。

如何通过点击 UITextView 中的特定字符来显示圆角灰色背景?

当通过点击背景关闭 UITextView 的键盘时,我在 didSelectRowAt 中得到错误的 indexPath

如何通过单击外部来关闭 Twitter Bootstrap 弹出窗口?

如何关闭 UITextView 的键盘

通过点击外部关闭 UIAlertViewController