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