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

StackOverflow https://stackoverflow.com/questions/159821

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Обновить

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

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

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

Это было полезно?

Решение

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

[NSIndexPath indexPathForRow:NSNotFound inSection:section]

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


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

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

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

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

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

Другие советы

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

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

Быстрый подход к тому же самому:

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)
}

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

let indexPath = IndexPath(row: NSNotFound, section: section)
tableView.scrollToRow(at: indexPath, at: .middle, animated: true)

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top