Как прокрутить UITableView в раздел, который не содержит строк? - PullRequest
31 голосов
/ 02 октября 2008

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

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

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

Обновление

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

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

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

Ответы [ 5 ]

118 голосов
/ 09 декабря 2008

ОБНОВЛЕНИЕ: похоже, эта ошибка исправлена ​​в 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];

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

4 голосов
/ 28 мая 2012

Это старый вопрос, но 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];
}

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

1 голос
/ 10 января 2018

Свифт подходит к тому же:

if rows > 0 {
    let indexPath = IndexPath(row: 0, section: section)
    self.tableView.setContentOffset(CGPoint.zero, animated: true)
    self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)
}

else {
    let sectionRect : CGRect = tableView.rect(forSection: section)
    tableView.scrollRectToVisible(sectionRect, animated: true)
}
0 голосов
/ 25 апреля 2019

Если в вашем разделе нет строк, используйте

let indexPath = IndexPath(row: NSNotFound, section: section)
tableView.scrollToRow(at: indexPath, at: .middle, animated: true)
0 голосов
/ 02 октября 2008

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

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

...