【问题标题】:How to make UITextView "Done" button resignFirstResponder?如何使 UITextView “完成”按钮 resignFirstResponder?
【发布时间】:2010-10-20 10:29:22
【问题描述】:

当用户点击“完成”时,我试图让我的可编辑UITextView 退出键盘 (resignFirstResponder)。使用UITextField,我已经能够使用以下代码做到这一点:

- (IBAction)doneEditing:(id)sender {
    [sender resignFirstResponder];
}

... 然后将其附加到 Interface Builder 中的相关 UITextField 到操作“Did End on Exit”。

但是,使用UITextView,我似乎无法访问“退出时结束”操作。关于如何实现这一点的任何建议?

【问题讨论】:

    标签: iphone interface-builder ios uitextview iboutlet


    【解决方案1】:

    接受的答案对我不起作用。相反,应该像这样调用以下委托方法:

    - (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
        if([text isEqualToString:@"\n"]){
            [textView resignFirstResponder];
            return NO;
        }else{
            return YES;
        }
    }
    

    将其粘贴到您指定为 UITextView 委托的类中,它会起作用。

    【讨论】:

    • 这个答案会忽略使用 UITextView 的全部原因,用户希望在其中添加多行,这就是返回按钮在 UITextView 上下文中的作用。
    • @zachzurn - 我认为这不适用于这个用例,在这种用例中,希望在键盘上有多行文本和完成按钮。我很清楚,让“完成”按钮像返回按钮一样使用会很差。
    • 如果用户复制粘贴回车到 textView 这将被触发。
    • 好点阿尔伯特 - 虽然只有当他们粘贴单独回车时才会发生这种情况。如果粘贴中有任何其他字符,则不会触发。但值得警惕。从理论上讲,如果您担心,您可以创建一个自定义 UITextView 并覆盖 paste 方法,尽管对我来说这可能不值得麻烦。
    • 2015 年这仍然是个问题
    【解决方案2】:

    新答案

    在您的视图上,您​​将有一个连接到以下 IBAction 的 UIBarButton(“完成”):

    - (IBAction)doneEditing:(id)sender {
        [textView resignFirstResponder];
    }
    

    其中 textView 是在 .h 文件中定义并在 Storyboard 或 .xib 文件中连接的 textView 出口。像这样:

    @property (retain, nonatomic) IBOutlet UITextView *textView;
    

    旧答案

    检查以下内容:

    1. 是否指定了 UITextViewDelegate 在.h
    2. 实现委托方法 对于 uitextview: textViewShouldEndEditing,返回 YES
    3. 确保您的 .m(控制器)是 IB 中 uitextview 的委托
    4. resignFirstResponder 现在应该 工作。

    【讨论】:

    • textViewShouldEndEditing 在用户按下 UITextView 上的 Return/Done 按钮时不会被调用,在 shouldChangeTextInRange 中检查回车是唯一的方法
    【解决方案3】:

    您可以在 Swift 4 中实现 UITextViewDelegate 并等待“\n”:

        myTextView.delegate = self
    
    // ...
    
    extension MyViewController : UITextViewDelegate {
    
        func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
            if text == "\n" {
                textView.resignFirstResponder()
                return false
            }
    
            return true
        }
    }
    

    【讨论】:

      【解决方案4】:

      要让完成按钮关闭键盘和resignFirstResponder,您必须实现一个委托方法。

      1. 在你的 .h 中实现 UITextFieldDelegate

        @interface YourViewController : UIViewController <UITextFieldDelegate>
        
      2. 然后在你的 .m 中实现 textFieldShouldReturn

        -(BOOL) textFieldShouldReturn:(UITextField *)textField
        {
        [textField resignFirstResponder];
        return YES;
        }
        
      3. 不要忘记将 UITextField 的委托链接到文件的所有者(非常重要)

      【讨论】:

        猜你喜欢
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多