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;
时,它就起作用了。但是我不知道为什么会这样,有人能告诉我为什么吗?
我有一个 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;
时,它就起作用了。但是我不知道为什么会这样,有人能告诉我为什么吗?