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

时间:2014-10-23 20:25:51

标签: ios iphone uitextfield uikit uitextfielddelegate

所以我一直在研究一个小的要求,这比我想要的时间更长,因为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:yay,键盘按钮更改,但是当我们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边缘时辞退第一响应者,因此您只会丢失一次键盘,通常不是很重要

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

3 个答案:

答案 0 :(得分:1)

这太过分了。只需将自己作为UITextView的委托,您将获得TextViewDidChange消息。

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

或者如果使用UITextField寄存器来获取其UITextFieldTextDidChangeNotification消息。

答案 1 :(得分:0)

在文本上添加委托更改

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


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

答案 2 :(得分:0)

试试这个 textField.returnKeyType = UIReturnKeyNext;