在文本字段中插入一个字符后启用完成按钮:textFieldDidEndEditing:或textFieldShouldBeginEditing:或?

Sef*_*an2 13 iphone uibarbuttonitem ios uitextfielddelegate

当用户在uitextfield中写入至少一个字符时,我想在导航栏上启用完成按钮(在模态视图中).我试过了:

  • textFieldDidEndEditing:当前一个uitextfield重新响应第一个响应者时启用该按钮(所以在当前uitextfield中使用零个字符).
  • textFieldShouldBeginEditing:当textfield成为第一个响应者时调用.还有另一种方法吗?

[编辑]

解决方案可能是

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
Run Code Online (Sandbox Code Playgroud)

但都没有

 [self.navigationItem.rightBarButtonItem setEnabled:YES];
Run Code Online (Sandbox Code Playgroud)

要么

[doneButton setEnabled:YES]; //doneButton is an IBOutlet tied to my Done UIBarButtonItem in IB
Run Code Online (Sandbox Code Playgroud)

工作.

w4n*_*ust 32

正确的代码是;

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger length = editingTextField.text.length - range.length + string.length;
    if (length > 0) {
        yourButton.enabled = YES;
    } else { 
        yourButton.enabled = NO;
    }
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如MasterBeta之前和David Lari之后正确指出的那样,该事件应该响应Editing Changed.我正在用David Lari的解决方案更新答案,因为这是标记为正确的解决方案.

- (IBAction)editingChanged:(UITextField *)textField
{
   //if text field is empty, disable the button
    _myButton.enabled = textField.text.length > 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案.标记为被接受的那个是错误的. (4认同)

Mas*_*eta 18

但是shouldChangeCharactersInRange当用户按下文本字段控件的清除按钮时不会被调用.当文本字段为空时,也应禁用您的按钮.

A IBAction可以与文本字段控件的编辑已更改事件相关联.当用户输入或按清除按钮时,它将被调用.

- (IBAction) editDidChanged: (id) sender {
    if (((UITextField*)sender).text.length > 0) {
        [yourButton setEnabled:YES];
    } else {
        [yourButton setEnabled:NO];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是***唯一正确答案***. (6认同)