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



所以我一直在处理一个小需求,这个小需求比我想要的花了更多的时间,就像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:是的,键盘按钮改变了,但当我们退出FirstResponder时,我们会放弃新的输入,这样用户就无法输入他们的密码。。。错误

尝试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边缘时辞去第一响应者的职务,所以你只会失去键盘一次,通常不是什么大不了的

那么问题来了,做这件事的最佳实践方式是什么?(如果你不熟悉这个问题,辞职第一响应者似乎只会在使用安全输入的情况下取消编辑),我还准备了一个示例项目,以帮助任何想要查看它的人:示例项目

这工作量太大了。只要让自己成为UITextView的委托人,就会收到TextViewDidChange消息。

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

或者,如果将UITextField寄存器用于其UITextFieldTextDidChangeNotification消息。

添加文本上的委托确实更改了

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

-(void)textFieldDidChange :(UITextField *)theTextField 
{
   enter your logic here 
}

试试这个textField.returnKeyType=UIReturnKeyNext;

相关内容

最新更新