Я установил делегата UITextField
к моему ViewController
класс.
В том классе я реализовал этот метод как следующее:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
kubi, спасибо. Ваш код работал. Только, чтобы быть явными (для новичков как), как Вы говорите, необходимо установить UITextField
delegate
, чтобы быть равными ViewController, в котором находится текстовое поле. Можно сделать это везде, где Вам нравится. Я выбрал viewDidLoad
метод.
- (void)viewDidLoad
{
// sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
daTextField.delegate = self;
}
При соединении события DidEndOnExit текстового поля к действию (IBAction) в InterfaceBuilder это будет передано, когда пользователь отклонит клавиатуру (с клавишей Return), и отправитель будет ссылкой на UITextField, который запустил событие.
, Например:
-(IBAction)userDoneEnteringText:(id)sender
{
UITextField theField = (UITextField*)sender;
// do whatever you want with this text field
}
Затем в InterfaceBuilder, связывают событие DidEndOnExit текстового поля к этому действию с Вашим контроллером (или независимо от того, что Вы используете для соединения событий от UI). Каждый раз, когда пользователь вводит текст и отклоняет текстовое поле, контроллер будет отправлен это сообщение.
Вы также можете создать метод в своем контроллере
-(IBAction)editingEnded:(id)sender{
[sender resignFirstResponder];
}
, а затем в инспекторе соединений в IB подключить к нему событие «Did End On Exit».
Вы заметите, что метод textFieldShouldReturn предоставляет объект текстового поля, который нажал кнопку DONE. Если вы установите TAG, вы можете включить это текстовое поле. Или вы можете отслеживать и сравнивать указатель объекта с некоторым значением члена, сохраненным его создателем.
Мой подход подобен этому для самообучения:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
bool fDidResign = [textField resignFirstResponder];
NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");
return fDidResign;
}
Между тем, я ставлю следующий тест «подтверждения», который отрицает отставку. Это только для иллюстрации, поэтому, если пользователь вводит NO! в поле его не уволят. Поведение было таким, как я хотел, но последовательность вывода была не такой, как я ожидал.
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"%s", __FUNCTION__);
if( [[textField text] isEqualToString:@"NO!"] ) {
NSLog(@"%@", textField.text);
return NO;
} else {
return YES;
}
}
Ниже приводится мой вывод NSLog для этого отказа, за которым следует принятие. Вы заметите, что я возвращаю результат отставки, но я ожидал, что он вернет мне ЛОЖЬ, чтобы доложить вызывающему ?! Помимо этого, он имеет необходимое поведение.
13.313 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:] 13.320 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:] 13.327 StudyKbd[109:207] NO! 13.333 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard 59.891 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:] 59.897 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldEndEditing:] 59.917 StudyKbd[109:207] -[StudyKbdViewController doneEditText]: NO 59.928 StudyKbd[109:207] -[StudyKbdViewController textFieldShouldReturn:]: did resign the keyboard
Просто добавьте
[textField endEditing:YES];
там, где вы хотите отключить клавиатуру и отобразить представление picker.