Включение кнопки Готово после вставки одного символа в текстовое поле: textFieldDidEndEditing: или textFieldShouldBeginEditing: or?

Я хотел бы включить кнопку "Готово" на панели навигации (в модальном представлении), когда пользователь пишет хотя бы символ в uitextfield. Я попробовал:

  • 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

работа.

7 ответов


правильный код;

-(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 раньше и Дэвид лари позже, событие должно реагировать на изменение редактирования. Я обновляю ответ решением Дэвида лари, поскольку это было отмечено как правильное.

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

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

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

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

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

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

}

на самом деле, в Xcode 6.x достаточно, чтобы пометить на Auto-enable Return Key


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


Swift 2.2

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

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

и переключить кнопку Готово внутри метода как:

func checkTextField(sender: UITextField) {

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

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


попробуйте и пойдите с:

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

}

этот ответ был отмечен правильно, когда infact лучшее решение существовало "w4nderlust" ниже. Это их ответ, пусть они берут на себя ответственность!