更改 UITextView 的键盘返回按钮的正确方法是啥

Posted

技术标签:

【中文标题】更改 UITextView 的键盘返回按钮的正确方法是啥【英文标题】:What is the correct way to change keyboard return button for UITextView更改 UITextView 的键盘返回按钮的正确方法是什么 【发布时间】:2014-10-23 20:25:51 【问题描述】:

所以我一直在处理一个小需求,这比我想要的要多得多,就像 UIKit 中的小需求有时会做的那样:

当用户输入的密码长度超过 3 个字符时,您可以更改 键盘有一个完成按钮。

很简单......似乎直到编辑结束才触发KVO,也没有调用textFieldDidEndEditing:委托方法。好的,很简单,只需在-(BOOL)textField:shouldChangeCharactersInRange:replacementString: 委托回调中执行我们的逻辑...

尝试 A:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

    NSString * newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    if (newString.length >=3)
    
        textField.returnKeyType = UIReturnKeyGo;
    
    return YES;

尝试 A,什么都不做......永远不要将键盘更改为 Go

尝试 B:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

    NSString * newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    if (newString.length >=3)
    
        textField.returnKeyType = UIReturnKeyGo;
        [textField resignFirstResponder];
        [textField becomeFirstResponder];
    
    return YES;

尝试 B:是的,键盘按钮发生了变化,但是当我们 resignFirstResponder 时,我们丢弃了新输入,因此用户无法输入他们的密码......不好

尝试 C:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

    NSString * newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    if (newString.length >=3)
    
        textField.returnKeyType = UIReturnKeyGo;
    else
        textField.returnKeyType = UIReturnKeyDefault;
    
    textField.text = newString;
    [textField resignFirstResponder];
    [textField becomeFirstResponder];

    return NO;

尝试 C 很棘手,我们返回 NO,告诉代理不要接受编辑,但这没关系,因为我们在代理中明确设置了字符串(这似乎是个坏主意),但是一切正常,除了当你退出 firstResponder 状态时,它会改变你的键盘(如果你有数字键盘,它会在每次击键后切换到默认值)

尝试 D:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

    NSString * newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    if (newString.length >=3)
    
        textField.returnKeyType = UIReturnKeyGo;
    else
        textField.returnKeyType = UIReturnKeyDefault;
    
    //detect if we have crossed a boundry
    if ((textField.text.length >=3) != (newString.length >=3))
    
        [textField resignFirstResponder];
        [textField becomeFirstResponder];
    
    textField.text = newString;

    return NO;

尝试 D 非常好,它只会在您越过 2/3 或 3/2 边缘时让第一响应者辞职,所以您只会丢失一次键盘,通常没什么大不了的

所以问题是,最好的做法是什么? (如果使用安全输入,辞职第一响应者似乎只会取消编辑,如果您不熟悉此问题),我还准备了一个示例项目,以帮助任何想要查看它的人:@987654321 @

【问题讨论】:

嘿伙计,在尝试 B 中,您可以使用 [self endEditing:YES]; 或许可以完成这项工作? :-O @Roma-MT 感谢您的建议,但它似乎以相同的方式工作,丢弃了新的输入。 也许,你可以在这个方法中使用你的逻辑吗? [textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; -(void)textFieldDidChange :(UITextField *)theTextField 【参考方案1】:

工作量太大了。只需让自己成为 UITextView 的代表,您就会收到 TextViewDidChange 消息。

- (void)textViewDidChange:(UITextView *)textView;

或者,如果使用 UITextField 注册其 UITextFieldTextDidChangeNotification 消息。

【讨论】:

我现在正在尝试这个,但我遇到了另一个问题,当调用 awakeFromNib 时我的出口没有设置。【参考方案2】:

在文本上添加委托确实发生了变化

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];  


-(void)textFieldDidChange :(UITextField *)theTextField 

   enter your logic here 

【讨论】:

【参考方案3】:

试试这个 textField.returnKeyType = UIReturnKeyNext;

【讨论】:

以上是关于更改 UITextView 的键盘返回按钮的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

当uitextView处于焦点时如何隐藏键盘~~

按下键盘中的返回键时,UITextView 不记得字体样式

如何关闭 UITextView 的键盘

当单词以@开头时,从键盘输入更改 UITextView 中的单词格式

使用 UITextView 时如何对键盘的 DONE 按钮做出反应?

xcode中的UITextView问题