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

Добавьте строки в UITableView при прокрутке вниз

Есть ли способ инициировать событие, например, с помощью IBAction, когда пользователь прокручивается в конец UITableView? Если это произойдет, я хотел бы добавить несколько строк. Как это сделать?

4b9b3361

Ответ 1

Просто прослушайте метод делегата scrollViewDidScroll:, сравните смещение содержимого с текущим возможным смещением, и если ниже, то некоторый порог вызовет ваш метод для обновления таблицы. Не забудьте вызвать [tableView reloadData], чтобы перезагрузить недавно добавленные данные.

РЕДАКТИРОВАТЬ: Составьте абстрактный код, не уверен, что он работает, но должен.

- (void)scrollViewDidScroll: (UIScrollView *)scroll {
     // UITableView only moves in one direction, y axis
     CGFloat currentOffset = scroll.contentOffset.y;
     CGFloat maximumOffset = scroll.contentSize.height - scroll.frame.size.height;

     // Change 10.0 to adjust the distance from bottom
     if (maximumOffset - currentOffset <= 10.0) {
          [self methodThatAddsDataAndReloadsTableView];
     }
}

Ответ 2

Если это немного поздно, но я думаю, что нашел лучшее решение:

вместо

 - (void)scrollViewDidScroll: (UIScrollView)scroll

Я использовал

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

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

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {    
    NSInteger currentOffset = scrollView.contentOffset.y;
    NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;

    if (maximumOffset - currentOffset <= -40) {
        NSLog(@"reload");
    }
}

Надеюсь, кто-нибудь поможет в этом.

Ответ 3

Я использую этот фрагмент. в tableView:willDisplayCell:forRowAtIndexPath: Я проверяю, будет ли ячейка с последним маршрутом индекса заглажена.

Для таблицыView с одним разделом:

[indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:0]

с большим количеством разделов:

[indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:[self numberOfSectionsInTableView:self.tableView]-1]

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(!_noMoreDataAvailable)
    {
        if ([indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:0]])
        {
            [self.dataSourceController fetchNewData];
        }
    }
}

после извлечения dataSourceController будет информировать делегата tableView, и это перезагрузит данные.

Ответ 4

NSInteger currentOffset = scrollView.contentOffset.y;
NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;

// Hit Bottom?
if ((currentOffset > 0) && (maximumOffset - currentOffset) <= 10) {
   // Hit Bottom !! 
}

Ответ 5

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

Сначала в файле .h объявите переменную:

CGPoint pointNow;

В файле .m в методе scrollViewDidScroll нам нужно реализовать этот код: -

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y > pointNow.y) {
        //Enter code here
    }
}

Ответ 6

Swift

Вот версия Swift @user944351 answer:

func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {

    let currentOffset = scrollView.contentOffset.y
    let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height

    if maximumOffset - currentOffset <= -40 {
        print("reload")
    }
}

Просто добавьте этот метод в свой класс делегатов UITableView. Я нашел -40 слишком большим, но вы можете настроить его в соответствии с вашими потребностями.

Подробнее

  • См. мой более полный ответ, в котором приведен пример метода перезагрузки данных с использованием ограничений и смещений для базы данных.

Ответ 7

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