Я только что потратил почти целый день на отслеживание очень странного случая, когда вызов resignFirstResponder на активном UITextField не скрывал клавиатуру, хотя первым отвечало текстовое поле. Это происходит, когда я помещаю контроллер представления поверх другого контроллера представления с активным текстовым полем. Клавиатура исчезает (как и ожидалось). Но если я верну клавиатуру обратно, коснувшись текстового поля во втором контроллере представления, последующие вызовы resignFirstResponder не имеют никакого эффекта.
Вот простой код для воспроизведения проблемы. Этот код представляет собой контроллер представления с кнопкой навигационной панели, чтобы скрыть клавиатуру, и другой, чтобы нажать другую копию себя (с подтверждением UIAlertView). Первая копия работает без проблем. Однако, если нажать на вторую копию (когда в первой копии клавиатура видна), то невозможно убрать клавиатуру. Это происходит только в том случае, если при нажатии на вторую копию на экране появляется UIAlertView (подтверждение). Если убрать строку #define ALERT
, то все работает.
Кто-нибудь знает, что здесь происходит? Похоже, что окно UIALertView каким-то образом вмешивается в работу клавиатуры и не дает своему окну исчезнуть, что затем сбивает с толку следующий вид. Есть ли здесь какое-нибудь решение, кроме как запустить контроллер второго вида по таймеру после того, как UIALertView исчезнет?
Извините за сложное описание. Это исполняемый код. Надеюсь, что код понятен.
@implementation DemoViewController
- (id) init {
if (!(self = [super init]))
return nil;
return self;
}
- (void) dealloc {
[_inputTextfield release];
[super dealloc];
}
- (void) loadView {
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
_inputTextfield = [[UITextField alloc] initWithFrame:CGRectMake(0., 0., 320., 44.)];
_inputTextfield.borderStyle = UITextBorderStyleRoundedRect;
_inputTextfield.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
_inputTextfield.keyboardAppearance = UIKeyboardAppearanceAlert;
_inputTextfield.autocapitalizationType = UITextAutocapitalizationTypeNone;
_inputTextfield.autocorrectionType = UITextAutocorrectionTypeNo;
_inputTextfield.keyboardType = UIKeyboardTypeDefault;
[view addSubview:_inputTextfield];
self.view = view;
[view release];
}
- (void) viewWillAppear:(BOOL) animated {
[super viewWillAppear:animated];
UIButton *downButton = [UIButton buttonWithType:UIButtonTypeCustom];
[downButton setTitle: @"keyboard down" forState:UIControlStateNormal];
[downButton addTarget:self action:@selector(downButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
[downButton sizeToFit];
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:downButton] autorelease];
UIButton *nextButton = [UIButton buttonWithType:UIButtonTypeCustom];
[nextButton setTitle: @"next" forState:UIControlStateNormal];
[nextButton addTarget:self action:@selector(nextButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
[nextButton sizeToFit];
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:nextButton] autorelease];;
}
- (void) viewWillDisappear:(BOOL) animated {
[super viewWillDisappear:animated];
[_inputTextfield resignFirstResponder];
}
- (void) downButtonPressed:(id)sender {
[_inputTextfield resignFirstResponder];
}
#define ALERT
- (void) alertView:(UIAlertView *) alertView didDismissWithButtonIndex:(NSInteger) buttonIndex {
if (alertView.cancelButtonIndex == buttonIndex) {
return;
}
[self _nextButtonPressed];
}
- (void) _nextButtonPressed {
DemoViewController *nextViewController = [[DemoViewController alloc] init];
[self.navigationController pushViewController:nextViewController];
[nextViewController release];
}
- (void) nextButtonPressed:(id)sender {
#ifdef ALERT
UIAlertView *alert = [[UIAlertView alloc] init];
alert.message = @"Next view?";
alert.cancelButtonIndex = [alert addButtonWithTitle:@"No"];
[alert addButtonWithTitle:@"Yes"];
alert.delegate = self;
[alert show];
[alert release];
#else
[self _nextButtonPressed];
#endif
}