textField:shouldChangeCharactersInRange:在UITextField中输入时不调用replacementString:

时间:2016-07-19 07:13:15

标签: ios objective-c uitextfield uitextfielddelegate

我有一个UITextField,我希望它的最大文本长度为20.所以我让self(当前视图控制器)同意<UITextFieldDelegate>并将self设置为文本字段的委托,并且使用以下方法设置最大长度:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == self.nickNameTextField)
    {
        if (textField.text.length > 20)
            return NO;
    }

    return YES;
}

然而,当我在这个函数中插入一个断点时,我发现当我输入任何单词时没有调用这个函数,更不用说当文本的长度超过20时。有人可以告诉我为什么吗?

3 个答案:

答案 0 :(得分:0)

您可能无法将文本字段与代理相关联 右键单击要委派的textField,然后在viewcontroller上拖动textField,然后选择该委托。

答案 1 :(得分:0)

我向您展示了使用XIB或Storyboard连接textField和delegate的步骤和屏幕截图。

在故事板中

步骤1:单击TextField enter image description here

第2步:将TextField拖到ViewController enter image description here

步骤3:单击TextField上的“control + mouse”到ViewController.h并显示行enter image description here

步骤4:现在Box将出现并提供TextField名称enter image description here

步骤5:右键单击ViewController中的TextField enter image description here

第6步:将委托连接到ViewController enter image description here

如果要以编程方式创建textField

UITextField *txtfldMaxLength = [[UITextField alloc] initWithFrame:CGRectMake(30, 100, 250, 50)];
txtfldMaxLength.borderStyle = UITextBorderStyleRoundedRect;
txtfldMaxLength.textColor = [UIColor blackColor];
txtfldMaxLength.backgroundColor = [UIColor clearColor];
txtfldMaxLength.font = [UIFont systemFontOfSize:17];
txtfldMaxLength.placeholder = @"enter something";
txtfldMaxLength.autocorrectionType = UITextAutocorrectionTypeNo;
txtfldMaxLength.keyboardType = UIKeyboardTypeDefault;
txtfldMaxLength.returnKeyType = UIReturnKeyDone;
txtfldMaxLength.clearButtonMode = UITextFieldViewModeWhileEditing;
txtfldMaxLength.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
txtfldMaxLength.delegate = self;
[self.view addSubview:txtfldMaxLength];

答案 2 :(得分:0)

我已经弄明白了这个问题。我使用这个语法来实例化一个UITextField:

self.nickNameTextField.delegate = self;
self.nickNameTextField = ({
    UITextField *textField = [UITextField new];
    textField.placeholder = [BBTCurrentUserManager sharedCurrentUserManager].currentUser.nickName;
    textField.textAlignment = NSTextAlignmentLeft;
    textField.backgroundColor = [UIColor lightGrayColor];
    textField;
});

最初我将textField的委托设置在大括号之外(就像上面的代码一样)。但是当我在括号内移动self.nickNameTextField.delegate = self;时,它就起作用了。但是我不知道为什么会这样,有人可以告诉我为什么?