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

Как прокрутить UITableView в раздел, который не содержит строк?

В приложении, над которым я работаю, у меня есть простой стиль UITableView, который может содержать раздел, содержащий нулевые строки. Я хочу иметь возможность прокручивать этот раздел, используя scrollToRowAtIndexPath: atScrollPosition: анимированный: но я получаю сообщение об ошибке, когда пытаюсь перейти к этому разделу из-за отсутствия дочерних строк.

Приложение календаря Apple может это сделать, если вы посмотрите на свой календарь в виде списка, и на сегодняшний день в календаре нет событий, на сегодняшний день добавлен пустой раздел, и вы можете прокручивать его с помощью кнопки "Сегодня" на панели инструментов в нижней части экрана. Насколько я могу судить, Apple может использовать настраиваемый UITableView или использовать частный API...

Единственным обходным решением, которое я могу придумать, является вставка пустого UITableCell с высоким разрешением в 0 пикселей и прокрутка к нему. Но я понимаю, что наличие ячеек разной высоты действительно плохо для прокрутки. Тем не менее, я все равно попробую, возможно, удар производительности будет не так уж плох.

Обновление

Поскольку, похоже, нет решения для этого, я подал отчет об ошибке с apple. Если это также влияет на вас, напишите дубликат rdar://problem/6263339 (Открыть ссылку Radar), если вы хотите, чтобы это было исправлено быстрее.

Обновление # 2

У меня есть достойное решение этой проблемы, взгляните на мой ответ ниже.

4b9b3361

Ответ 1

UPDATE: Похоже, эта ошибка исправлена ​​в iOS 3.0. Вы можете использовать следующий NSIndexPath для перехода к разделу, содержащему 0 строк:

[NSIndexPath indexPathForRow:NSNotFound inSection:section]

Я оставлю свое обходное решение для тех, кто все еще поддерживает проект с использованием 2.x SDK.


Найден достойный обход:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
[tableView scrollRectToVisible:sectionRect animated:YES];

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

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
sectionRect.size.height = tableView.frame.size.height;
[tableView scrollRectToVisible:sectionRect animated:YES];

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

Ответ 2

Это старый вопрос, но Apple все еще ничего не добавила, что помогает или исправляет ошибку при сбое, когда раздел не имеет строк.

Для меня мне действительно нужно было сделать новый раздел прокрутки до середины, когда он добавлен, поэтому теперь я использую этот код:

if (rowCount > 0) {
    [self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: sectionIndexForNewFolder] 
                          atScrollPosition: UITableViewScrollPositionMiddle
                                  animated: TRUE];
} else { 
    CGRect sectionRect = [self.tableView rectForSection: sectionIndexForNewFolder];
    // Try to get a full-height rect which is centred on the sectionRect
    // This produces a very similar effect to UITableViewScrollPositionMiddle.
    CGFloat extraHeightToAdd = sectionRect.size.height - self.tableView.frame.size.height;
    sectionRect.origin.y -= extraHeightToAdd * 0.5f;
    sectionRect.size.height += extraHeightToAdd;
    [self.tableView scrollRectToVisible:sectionRect animated:YES];
}

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

Ответ 3

Я думаю, что пустая строка, вероятно, единственный способ пойти туда. Возможно ли перепроектировать пользовательский интерфейс так, чтобы "пустая" строка могла отображать что-то полезное?

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