ios - 更改 UITextView 键盘返回按钮的正确方法是什么

标签 ios iphone uitextfield uikit uitextfielddelegate

所以我一直在致力于一个小需求,但它花费了我比我想要的更多的时间,就像 UIKit 中的小需求有时似乎会这样做一样:

When a user enters a password longer than 3 characters you change the keyboard to have a done button.

足够简单...似乎在编辑结束之前 KVO 不会被触发,并且 textFieldDidEndEditing: 委托(delegate)方法也不会被调用。好的,很简单,只需在
-(BOOL)textField:shouldChangeCharactersInRange:replacementString: 委托(delegate)回调中执行我们的逻辑...

尝试 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,告诉委托(delegate)不要接受编辑,但这没关系,因为我们在委托(delegate)中显式设置了字符串(这似乎是一个坏主意),但是这一切都有效,除了当您退出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 边缘时放弃第一响应者,因此您只会丢失键盘一次,通常没什么大不了的

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

最佳答案

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

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

或者如果使用 UITextField 注册它的 UITextFieldTextDidChangeNotification 消息。

关于ios - 更改 UITextView 键盘返回按钮的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26536780/

相关文章:

ios - 要覆盖哪个委托(delegate)来调整自动滚动?

ios - 如何在 MFMailComposeController 中实现类似于电子邮件文本字段的 UITextField

ios - 避免静态库中的符号引用

ios - 覆盖 ImageView 的图像属性时出错

iphone - Cocos2d - 我可以将多个 Sprite 帧加载到帧缓存中吗

ios - 如何防止用户输入密码时文本移动?

ios - iOS 应用 CPU 徘徊在 100% 左右是否正常?

ios - 一次创建多个本地通知失败

ios - iPhone 6 崩溃。无法获取原因

iphone - 禁用滚动 UIWebView