Включение кнопки «Готово» после вставки одного символа в текстовое поле: textFieldDidEndEditing: или textFieldShouldBeginEditing: или? - PullRequest
13 голосов
/ 25 февраля 2011

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

  • textFieldDidEndEditing: включает кнопку, когда предыдущее поле uitext уходит в отставку первым респондентом (то есть с нулевыми символами в текущем поле uitext).
  • 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 ]

32 голосов
/ 21 октября 2011

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

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

- (IBAction)editingChanged:(UITextField *)textField
{
   //if text field is empty, disable the button
    _myButton.enabled = textField.text.length > 0;
}
18 голосов
/ 19 марта 2012

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

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

- (IBAction) editDidChanged: (id) sender {
    if (((UITextField*)sender).text.length > 0) {
        [yourButton setEnabled:YES];
    } else {
        [yourButton setEnabled:NO];
    }
}
3 голосов
/ 08 октября 2013

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

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

}
1 голос
/ 05 марта 2015

На самом деле, в Xcode 6.x достаточно для включения ON. Ключ возврата для автоматического включения

0 голосов
/ 12 июля 2016

Свифт 2,2

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

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

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

func checkTextField(sender: UITextField) {

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

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

0 голосов
/ 18 июля 2014

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

0 голосов
/ 25 февраля 2011

попробуйте и наберите:

-(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 лучшего решения.Это их ответ, пусть они возьмут кредит!

...