Кадр TableView не изменяется должным образом при нажатии на новый контроллер представления и клавиатура прячется - PullRequest
0 голосов
/ 10 июня 2010

Я, должно быть, здесь упускаю что-то фундаментальное.У меня есть 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];   
}

1 Ответ

2 голосов
/ 10 июня 2010

Прямо перед тем, как вы нажмете свой контроллер вида, найдите первого респондента и позвоните в отставку. Используйте категорию из этого поста SO , чтобы узнать, как рекурсивно найти первого респондента (не уверен, что вы уже делаете это).

- (void)tableView:(UITableView *)tableView 
          didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIView *fp = [[self view] findFirstResponder];

    [fp resignFirstResponder];

    // Push new view controller here.
    NextViewController *controller = [[NextViewController alloc] init];
    [[self navigationController] pushViewController:controller animated:YES];
    [controller release], controller = nil;
}

Еще одна вещь, которую нужно иметь в виду, заключается в том, что размер табличного представления автоматически изменяется, потому что ваш корневой контроллер представления является производным от UITableViewController (или так кажется). Если вы сделаете свой контроллер корневого представления обычным UIViewController, который содержит UITableView, вы можете легче манипулировать фреймом табличного представления вручную - по крайней мере, это был мой опыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...