Подтвердить что ты не робот

Неверный поиск UISearchDisplayControllerResultsTableView ContentSize. Ошибка в iOS 7?

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

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

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

Любые идеи о том, как исправить это?

4b9b3361

Ответ 1

У меня была эта точная проблема. Решение, размещенное на форумах разработчиков здесь, работало на меня. Не уверен, что это ошибка в 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];

}

Ответ 2

Эта системная ошибка остается в 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];
}