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

textField:shouldChangeCharactersInRange:replacementString: isn't called when inputing in a UITextField

我有一个 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 时更不用说了。有人能告诉我为什么吗?

您可能还没有将您的文本字段与委托链接起来 右键单击要委托的 textField,然后将 textField 拖到 viewcontroller 上并放到 select 委托上。

我向您展示了将 textField 和委托与 XIB 或 Storyboard 连接的步骤和屏幕截图。

在情节提要中

第 1 步:单击文本字段

第 2 步:将 TextField 拖到 ViewController

第 3 步:在 TextField 上单击 "control+mouse" 到 ViewController.h 并且行显示

STEP 4:Now 框将出现并提供文本字段名称

步骤 5:Right 单击 ViewController 中的文本字段

STEP 6:Hook 将代表提升到 ViewController

如果您想以编程方式创建文本字段

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];

好吧,我已经找到问题所在了。我使用这个语法来实例化一个 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; 时,它就起作用了。但是我不知道为什么会这样,有人能告诉我为什么吗?