Как запустить UITableView на последней ячейке?

У вас есть несколько вариантов:

  1. Сырой запрос
  2. Недокументированный подход Эмульбре
  3. Создайте третье поле progress_X_estimated_days и обновите его, чтобы сохранить перезаписанный метод. Затем выполните агрегацию через это новое поле.

Перезапись:

class Task(models.Model):
   progress = models.PositiveIntegerField()
   estimated_days = models.PositiveIntegerField()
   progress_X_estimated_days = models.PositiveIntegerField(editable=False)

   def save(self, *args, **kwargs):
      progress_X_estimated_days = self.progress * self.estimated_days
      super(Task, self).save(*args, **kwargs)

26
задан kennytm 28 January 2010 в 17:57
поделиться

4 ответа

scrollToRowAtIndexPath должен работать.

В viewWillAppear:, попробуйте следующее:

[theTableView reloadData];    
NSIndexPath* ip = [NSIndexPath indexPathForRow:rowNumberHere inSection:sectionNumberHere];
[theTableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionTop animated:NO];

rowNumberHere - это номер строки в источнике данных, к которому вы хотите прокрутить.

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

Установка перезагрузкаДанные: позволяет избежать исключения, если данные еще не загружены в viewWillAppear:. Если вы поместите прокруткуToRowAtIndexPath в viewDidAppear:, вам не понадобится reloadData:, но вы увидите небольшой скачок таблицы, который, как вы говорите, вам не нужен.

Редактирование: @Theory, попробуйте изменить свой код следующим образом...

[tableView reloadData];
int lastRowNumber = [tableView numberOfRowsInSection:0] - 1;
NSIndexPath* ip = [NSIndexPath indexPathForRow:lastRowNumber inSection:0];
[tableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionTop animated:NO];

Обратите внимание на номерOfRowsInSection возвращает счетчик строк, а не последний номер строки (то есть счетчик строк - 1).

57
ответ дан 28 November 2019 в 06:09
поделиться

Вы можете вызвать -scrollToRowAtIndexPath: atScrollPosition: animated в -viewWillAppear: метод вашего TableViewController.

atScrollPosition: позволяет указать, где вы хотите разместить ячейку для rowAtIndexPath. Есть четыре варианта:

UITableViewScrollPositionTop - помещает вашу ячейку прямо в верхнюю часть представления

UITableViewScrollPositionMiddle - центрирует вашу ячейку в представлении

UITableViewScrollPositionBottom - помещает вашу ячейку внизу

UITableViewScrollPositionNone - Использование этого параметра позволит позиционировать ячейку в представлении пользователя с минимальной прокруткой / перемещением.

Поведение отличается в трех сценариях: -

Если ячейка уже видна, она ничего не делает.

Если ячейка находится над текущим представлением, она прокручивает ячейку до верхней части представления.

Если ячейка находится ниже текущего представления, она прокручивает ячейку до нижней части представления.

9
ответ дан Deepak Danduprolu 15 October 2019 в 06:57
поделиться

После ответа DyingCactus выше, я добавил этот метод к своему контроллеру:

-(void)viewWillAppear:(BOOL)animated {
      [self.tableView reloadData];    
      NSIndexPath* ip = [NSIndexPath indexPathForRow:[self.tableView numberOfRowsInSection:0] - 1 inSection:0];
      [self.tableView scrollToRowAtIndexPath:ip atScrollPosition:UITableViewScrollPositionTop animated:NO];
}

И теперь он работает, именно то, что я хотел. Спасибо!

7
ответ дан theory 15 October 2019 в 06:57
поделиться

Проблема с методом scrollToRowAtIndexPath заключается в его медленной работе, и tableView требуется время для прокрутки до дна.

У меня была точно такая же проблема, после того, как я попробовал все (так же как и вы), это сработало, ключ в том, что если вы используете autolayout, инициализируйте scrollToBottom в true, а затем сделайте это

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    // Scroll table view to the last row
    [self scrollToBottom];
}

-(void)scrollToBottom {
    if (shouldScrollToLastRow)
    {
        CGPoint bottomOffset = CGPointMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height);
        [self.tableView setContentOffset:bottomOffset animated:NO];
    } }

, выполнив это гарантирует, что вы почти в нижней части таблицы, но не в самой нижней части, так как невозможно точно определить смещение дна, когда вы находитесь в верхней части таблицы, поэтому после этого мы можем реализовать scrollViewDidScroll

-(void)scrollViewDidScroll: (UIScrollView*)scrollView
{
    float scrollViewHeight = scrollView.frame.size.height;
    float scrollContentSizeHeight = scrollView.contentSize.height;
    float scrollOffset = scrollView.contentOffset.y;

    // if you're not at bottom then scroll to bottom
    if (!(scrollOffset + scrollViewHeight == scrollContentSizeHeight))
    {
        [self scrollToBottom];
    } else {
    // bottom reached now stop scrolling
        shouldScrollToLastRow = false;
    }
}
4
ответ дан Ankur Teotia 15 October 2019 в 06:57
поделиться