Включение кнопки завершения после вставки одного char в текстовое поле: textFieldDidEndEditing: или textFieldShouldBeginEditing: или?

Я хотел бы включить кнопку done на навигационной панели (в модальном виде), когда пользователь пишет по крайней мере char в поле uitext. Я пробовал:

  • textFieldDidEndEditing: включает кнопку, когда предыдущее uitextfield уходит в отставку с первого ответчика (так что с нулевыми символами в текущем uitextfield).
  • textFieldShouldBeginEditing: вызывается, когда текстовое поле становится первым ответчиком. Есть ли другой способ сделать это?

[EDIT]

Решение может быть

-(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

работа.

Ответы

Ответ 1

Правильный код:

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

Edit: Как правильно указал MasterBeta раньше и Дэвид Лари позже, событие должно ответить на "Редактирование изменено". Я обновляю ответ с помощью решения Дэвида Лари, поскольку это было отмечено как правильно.

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

Ответ 2

Но shouldChangeCharactersInRange не будет вызываться, когда пользователь нажимает кнопку очистки текстового поля. И ваша кнопка также должна быть отключена, когда текстовое поле пуст.

A IBAction может быть связано с редактированием Измененного события управления текстовым полем. И он будет вызываться, когда пользователи набирают или нажимают кнопку очистки.

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

Ответ 3

@MasterBeta: Почти правильно. Следуйте его инструкциям, чтобы связать действие с Редактированием Изменено, но этот код проще и не имеет опечаток:

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

}

Ответ 4

На самом деле, в Xcode 6.x достаточно, чтобы флаг в ON Включить Auto-enable Return

Ответ 5

Этот ответ, кажется, работает во всех сценариях. Одиночный символ, ясный и все изменения. Надеюсь, кто-то найдет это полезным.

Ответ 6

Swift 2.2

Вы можете назначить настраиваемый метод "checkTextField()" на "myTextField" UITextField как:

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

и переключите кнопку done внутри метода следующим образом:

func checkTextField(sender: UITextField) {

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

Нет необходимости в каких-либо делегатах.

Ответ 7

попробуйте и продолжайте:

-(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' ниже. Этот ответ принадлежит им, пусть они берут кредит!