13

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

  • textFieldDidEndEditing:当前一个 uitextfield 退出第一响应者时启用按钮(因此当前 uitextfield 中的零字符)。
  • textFieldShouldBeginEditing:当文本字段成为第一响应者时调用。还有另一种方法可以做到这一点吗?

[编辑]

解决方案可能是

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

但两者都不是

 [self.navigationItem.rightBarButtonItem setEnabled:YES];

或者

[doneButton setEnabled:YES]; //doneButton is an IBOutlet tied to my Done UIBarButtonItem in IB

工作。

4

7 回答 7

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

编辑:正如 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;
}
于 2011-10-21T14:21:29.573 回答
18

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

AIBAction可以与文本字段控件的Editing Changed事件连接。当用户键入或按下清除按钮时会调用它。

- (IBAction) editDidChanged: (id) sender {
    if (((UITextField*)sender).text.length > 0) {
        [yourButton setEnabled:YES];
    } else {
        [yourButton setEnabled:NO];
    }
}
于 2012-03-19T06:24:06.527 回答
3

@MasterBeta:几乎正确。按照他的指示将操作连接到Editing Changed,但此代码更简单并且没有拼写错误:

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

}
于 2013-10-08T15:35:02.867 回答
1

实际上,在 Xcode 6.x 中足以标记 ON Auto-enable Return Key

于 2015-03-05T18:57:42.873 回答
0

这个答案似乎在所有情况下都有效。单一的字符,清晰和所有的变化。希望有人觉得这很有帮助。

于 2014-07-17T22:46:56.727 回答
0

斯威夫特 2.2

您可以将自定义方法“checkTextField()”分配给“myTextField”UITextField,如下所示:

myTextField.addTarget(self, action: #selector(self.checkTextField(_:)), forControlEvents: .EditingChanged);

并将方法内的完成按钮切换为:

func checkTextField(sender: UITextField) {

    doneButton.enabled = !sender.hasText();
}

不需要任何代表。

于 2016-07-12T09:43:43.263 回答
-2

尝试使用:

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

}

当下面的“w4nderlust”实际上存在更好的解决方案时,这个答案被标记为正确。这个答案是他们的,让他们来承担吧!

于 2011-02-25T14:52:10.563 回答