Я, должно быть, здесь упускаю что-то фундаментальное.У меня есть UITableView внутри NavigationViewController.Когда строка таблицы выбирается в UITableView (используя tableView: didSelectRowAtIndexPath :), я вызываю pushViewController для отображения другого контроллера представления.Новый контроллер представления отображается правильно, но когда я открываю этот контроллер представления и возвращаю UITableView, размер изменяется, как если бы отображалась клавиатура.Мне нужно найти способ спрятать клавиатуру, прежде чем я нажимаю на контроллер вида, чтобы правильно восстановить кадр.Если я закомментирую код для нажатия контроллера просмотра, то клавиатура будет правильно скрываться, а размер кадра будет корректно изменен.
Код, который я использую для отображения клавиатуры, выглядит следующим образом:
- (void) keyboardDidShowNotification:(NSNotification *)inNotification {
NSLog(@"Keyboard Show");
if (keyboardVisible) return;
// We now resize the view accordingly to accomodate the keyboard being visible
keyboardVisible = YES;
CGRect bounds = [[[inNotification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
bounds = [self.view convertRect:bounds fromView:nil];
CGRect tableFrame = tableViewNewEntry.frame;
tableFrame.size.height -= bounds.size.height; // subtract the keyboard height
if (self.tabBarController != nil) {
tableFrame.size.height += 48; // add the tab bar height
}
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(shrinkDidEnd:finished:contextInfo:)];
tableViewNewEntry.frame = tableFrame;
[UIView commitAnimations];
}
клавиатура скрыта с помощью:
- (void) keyboardWillHideNotification:(NSNotification *)inNotification {
if (!keyboardVisible) return;
NSLog(@"Keyboard Hide");
keyboardVisible = FALSE;
CGRect bounds = [[[inNotification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
bounds = [self.view convertRect:bounds fromView:nil];
CGRect tableFrame = tableViewNewEntry.frame;
tableFrame.size.height += bounds.size.height; // add the keyboard height
if (self.tabBarController != nil) {
tableFrame.size.height -= 48; // subtract the tab bar height
}
tableViewNewEntry.frame = tableFrame;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(_shrinkDidEnd:finished:contextInfo:)];
tableViewNewEntry.frame = tableFrame;
[UIView commitAnimations];
[tableViewNewEntry scrollToNearestSelectedRowAtScrollPosition:UITableViewScrollPositionMiddle animated:YES];
NSLog(@"Keyboard Hide Finished");
}
Я запускаю скрытую клавиатуру, оставляя первого ответчика для любого элемента управления, который является первым ответчиком в ViewWillDisappear.Я добавил операторы NSLog и вижу, что в файле журнала происходит следующее:
Показать клавиатуру
ViewWillDisappear: Скрытие клавиатуры
Скрыть клавиатуру
Клавиатура Скрыть завершена
PushViewController (запись NSLogв тот момент, когда я нажимаю новый контроллер вида)
Из этой трассы я вижу, что все происходит в правильном порядке, но кажется, что когда контроллер вида нажимается, код скрытия клавиатуры невыполнить правильно.
Любые идеи будут по достоинству оценены.Некоторое время я бился головой о клавиатуру, пытаясь понять, что я делаю не так.
- добавлен didSelectRowAtIndexPath
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
switch (indexPath.section) {
case 0: // Required Info
// removed to simplify
case 1: // Optional Info
switch (indexPath.row) {
case 0:
[self showTextDetailPicker: @"Enter a description"
tag: tDescriptionPicker
sourceTarget: self.newRecord
fieldSource: @selector(description)];
break;
default:
break;
}
break;
default:
break;
}
}
- (void) showTextDetailPicker: (NSString*) titleText tag:(int)tagID sourceTarget:(NSObject*)target fieldSource:(SEL)selector{
FieldEditorViewController *fe = [[FieldEditorViewController alloc] init];
fe.titleText = titleText;
fe.fieldText = [target performSelector: selector];
fe.tag = tagID;
// Replace default back button with one that just says 'Back'
UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc]
initWithTitle:@"Back"
style:UIButtonTypeInfoLight
target:nil action:nil];
[[self navigationItem] setBackBarButtonItem: newBackButton];
[newBackButton release];
[fe setDelegate: self];
[self.navigationController pushViewController:fe animated:YES];
[fe release];
}