ContentSize searchResultsTableView UISearchDisplayController неверен. Ошибка в iOS 7?

Приведенная ниже проблема возникает только в приложении iOS 6.0/6.1, работающем на устройстве iOS 7.0+.

Итак, у меня есть UISearchDisplayController, который ищет наш API и возвращает данные. Это все работает, и все отображается так, как мы хотим. Единственная проблема, которую мы видим, заключается в том, что после того, как содержимое заполнило searchResultsTableView, кажется, что когда клавиатура изначально скрыта, contentSize из searchResultsTableView намного больше, чем данные, и на самом деле кажется, что это размер клавиатуры. Когда я вхожу в панель поиска, показываю клавиатуру и снова нажимаю «Поиск» (просто чтобы скрыть клавиатуру), contentSize затем правильно настраивается, чтобы заполнить только экран, и ничего более. Ниже приведен снимок экрана того, о чем я говорю с начальной популяцией tableView.

Белый цвет — это данные таблицы, а серый/кремовый цвет — дополнительное пространство tableView.

Есть какие нибудь идеи как это починить?


person Alex Muller    schedule 28.09.2013    source источник


Ответы (2)


У меня была именно эта проблема. Решение, размещенное на форумах разработчиков здесь, сработало для меня. Не уверен, что это ошибка в iOS 7 или они просто изменили способ работы, но это единственное решение, которое, как я нашел, решило мою проблему.

Решение из сообщения на форуме для ленивых:

- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView {

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];

}



- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView {

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide) name:UIKeyboardWillHideNotification object:nil];

}



- (void) keyboardWillHide {

    UITableView *tableView = [[self searchDisplayController] searchResultsTableView];

    [tableView setContentInset:UIEdgeInsetsZero];

    [tableView setScrollIndicatorInsets:UIEdgeInsetsZero];

}
person Rebecca Duhard    schedule 03.10.2013
comment
Работал как шарм! Однако меня очень смущает, что если я добавлю наблюдателя в viewDidLoad и удалю его в dealloc. Вставки индикатора контента и прокрутки стали отрицательными. Не уверен, почему это произошло. - person David Liu; 05.08.2014
comment
для iOS 8 вы должны проверить ответ @Allen ниже - person Flores Robles; 16.06.2015

Эта системная ошибка остается в iOS 8, и решение с ответом на принятие больше не работает. Итак, вы должны использовать следующее решение:

-(void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

-(void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

-(void)keyboardWillHide:(NSNotification*)notification {
    CGFloat height = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
    UITableView *tableView = [[self searchDisplayController] searchResultsTableView];
    UIEdgeInsets inset;
    [[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0 ? (inset = UIEdgeInsetsMake(0, 0, height, 0)) : (inset = UIEdgeInsetsZero);
    [tableView setContentInset:inset];
    [tableView setScrollIndicatorInsets:inset];
}
person Allen    schedule 09.03.2015
comment
Это работает отлично! Принятый ответ на iOS 8 предотвратит прокрутку нижней части табличного представления. - person wilsontgh; 10.03.2015