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

UITableViewIndex неожиданно превращается в неправильные оценки

У меня есть стандартная настройка UITableView + UISearchDisplayController + UITableViewIndex. Все работает как чемпион.

Кроме того, при очень специфических условиях индекс растет слишком долго, чтобы отображать на экране. В частности, после завершения поиска и повторной отображения нефильтрованной индексированной таблицы индекс иногда растет слишком долго.

В частности, это не происходит, если я выполняю поиск и отменю. Это происходит только в том случае, если я выполняю поиск, затем нажимаю контроллер просмотра из таблицы поиска, затем возвращаю этот контроллер представления в таблицу поиска, затем отменяю поиск, затем пересматривает, а затем отменяю окончательный поиск. После окончания окончательного поиска индекс слишком длинный.

В портрете вид таблицы сообщает высоту 416, а индекс - 404 при нормальных условиях. Если я регистрируюсь из searchDisplayControllerDidEndSearch, когда индекс имеет неправильный размер, он сообщает о высоте 620.

Я пробовал все: от setLayout в таблице и индекс, чтобы вручную изменить размер фрейма. Ничего не работает (ручная настройка размера приводит к тому, что правильная высота регистрируется, но она не меняет отображение на экране).

Я собирался повторить калибровку после задержки в случае вмешательства анимации отмены, но затем я понял, в какой абсурдной ситуации я вхожу, и думал, что поиск помощи может быть мудрым...

4b9b3361

Ответ 1

Если у вас по-прежнему возникают проблемы, вы можете попробовать установить символическую точку останова на - [UITableView setFrame:] и трассировать, откуда приходит вызов заданного фрейма. НТН

Ответ 2

Мой сценарий немного отличался от того, который был опубликован, но я нашел решение, которое работает в моем случае, так что, надеюсь, в том же, что и здесь.

У меня есть UITableView, который использует fetchedResultsController и загружает больше элементов с сервера, когда вы достигаете конца tableView. При поиске фильтр fetchedResultsController отфильтровывается и загружает больше записей с сервера, если их недостаточно для отображения.

Когда соединение возвращает результаты (после нажатия "поиск" ), я перезагружаю tableViews (исходный и searchResultsTableView). Теперь, когда вы отменяете поиск, и все возвращается к нормальному состоянию, я испытываю проблему с вопросом. UITableViewIndex растет до неожиданных границ.

Так как я также ощущаю, что UITableView изменен, чтобы быть намного большим, чем ожидалось, я сыграл догадку, и это сработало для меня. В подклассе UITableView (это ARC/6.1):

- (void)loadView
{
    [super loadView];

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

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification
{
    if ( self.isSearching )
    {
        // Ensure the correct height of the original tableview while displaying the searchresults-tableview
        // only this will make sure, the height of the UITableViewIndex is set correctly ...
        [UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^(){
            CGRect rect = self.tableView.frame;
            rect.size.height -= [self.tableView convertRect:[[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil].size.height;
            self.tableView.frame = rect;
        }];
    }
}

- (void)keyboardWillHide:(NSNotification *)notification
{
    if ( self.isSearching )
    {
        // Ensure the correct height of the original tableview while displaying the searchresults-tableview
        // only this will make sure, the height of the UITableViewIndex is set correctly ...
        [UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^(){
            CGRect rect = self.tableView.frame;
            rect.size.height += [self.tableView convertRect:[[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil].size.height;
            self.tableView.frame = rect;
        }];
    }
}

Вам может потребоваться настроить это.