Неверный поиск UISearchDisplayControllerResultsTableView ContentSize. Ошибка в iOS 7?
Следующая проблема возникает только в приложении iOS 6.0/6.1, запущенном на устройстве iOS 7.0+.
Итак, у меня есть UISearchDisplayController
, который ищет наш API и возвращает данные. Все это работает, и все отображается так, как мы хотим. Единственная проблема, которую мы видим, заключается в том, что после того, как контент заполнил searchResultsTableView
, кажется, что когда клавиатура изначально скрыта, contentSize
searchResultsTableView
намного больше данных, и на самом деле это похоже размер клавиатуры. Когда я войду в панель поиска и покажу клавиатуру, и снова нажмите "Поиск" (просто чтобы скрыть клавиатуру), contentSize
затем правильно настроится, чтобы заполнить экран, и ничего больше. Ниже показан снимок экрана, о котором я говорю, с исходной популяцией tableView
.
![]()
Белый - это данные таблицы, а серый/кремовый цвет - дополнительное пространство tableView
.
Любые идеи о том, как исправить это?
Ответы
Ответ 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];
}