Разбиение на страницы UITableView — обновление снизу для загрузки новых данных в Swift

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

Заранее спасибо.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell

    print(indexPath.row)

    if (indexPath.row + 1 < self.TotalRowsWithPages) {
        cell.textLabel?.text = "\(self.myarray!.[indexPath.row].body)"
    } else {

        cell.textLabel?.text = "Loading more data...";

        // User has scrolled to the bottom of the list of available data so simulate loading some more if we aren't already
        if (!self.isLoading) {
            self.isLoading = true;
            self.TotalRowsWithPages = self.TotalRowsWithPages + self.PageSize
            self.getmoredata()
        }
    }

    return cell
}

person Chris G.    schedule 19.02.2016    source источник


Ответы (3)


Нет, вы не можете использовать этот подход, потому что cellForRowAtIndexPath вызывается много раз, а также потребуется много времени, чтобы проверить ваши условия!

Здесь я нашел лучший вариант для UITableView разбиения на страницы.

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

    //Bottom Refresh

    if scrollView == tableView{

        if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height)
        {
            if !isNewDataLoading{

                if helperInstance.isConnectedToNetwork(){

                    isNewDataLoading = true
                    getNewData()
                }
            }
        }
    }
}

isNewDataLoading это Bool, чтобы проверить, что UITableView загружает новые данные или нет!

Надеюсь это поможет!

person Sohil R. Memon    schedule 19.02.2016
comment
@UtkuDalmaz Можете ли вы сказать мне, что именно не работает? - person Sohil R. Memon; 25.10.2017
comment
Двоичный оператор «==» не может применяться к операндам типа «UIScrollView» и «_». - person Utku Dalmaz; 25.10.2017
comment
Не могли бы вы объяснить, что делает helperInstance.isConnectedToNetwork() в этом примере? - person Abrcd18; 17.03.2021
comment
@ Abrcd18 Abrcd18 Это обычный метод проверки интернет-соединения. Чтобы увидеть, что мы не вызываем API, если Интернет недоступен. - person Sohil R. Memon; 17.03.2021

Вы должны реализовать загрузку больше в tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath). Когда отображается последняя загрузка ячейки, это означает, что пользователь прокручивает страницу вниз, поэтому вам нужно загрузить больше данных.

Возможно, это выглядит так:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if !(indexPath.row + 1 < self.TotalRowsWithPages) {
        self.isLoading = true;
        self.getmoredata()

    }
}
person vien vu    schedule 19.02.2016
comment
Я пробовал этот подход. willDisplayCell вызывается независимо от того, где находится пользователь. когда вы перезагружаете данные в tableview, willDisplayCell вызывается для каждой строки. Принятый ответ работает отлично. - person Awais Fayyaz; 21.04.2020

Попробуйте проверить больше данных не в cellForRowAtIndexPath, а в UIScrollViewDelegate - [DataModel sharedMyLibrary] - это мой класс источника данных, загружающий видеоданные с использованием RESTful API с разбиением на страницы, это метод fetchWithCompletion извлекает данные с сервера в асинхронном режиме, его метод hasMore говорит, что на сервере есть больше данных ( JSON содержит следующую ссылку) LibraryTableViewController — это подкласс UITableViewController, hasMore — это представление в нижней части табличного представления в раскадровке, содержащее кнопку, поэтому у пользователя есть два варианта: прокрутить вниз или нажать кнопку. Кроме того, если это представление отображается, это означает, что на сервере есть дополнительные данные. _canFetch предотвращает вложенную загрузку с сервера.

``

@interface LibraryTableViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIView *hasMore;
@end
@implementation LibraryTableViewController
{
    __block volatile uint8_t _canFetch;
}
@synthesize hasMore = _hasMore;
- (void)viewDidLoad
{
    _canFetch = 0x80;
    [super viewDidLoad];
    [self fetchVideos:NO];
}
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
    CGPoint offset = [scrollView contentOffset];
    if ([[DataModel sharedMyLibrary] hasMore])
    {
        if (((velocity.y > 0.0) && (offset.y > (*targetContentOffset).y)) || ((velocity.x > 0.0) && (offset.x > (*targetContentOffset).x)))
        {
            [self fetchVideos:NO];
        }
    }
    else
    {
        [_hasMore setHidden:YES];
    }
}
- (IBAction)moreVideos:(UIButton *)sender
{
    [self fetchVideos:NO];
}
- (IBAction)doRefresh:(UIRefreshControl *)sender
{
    [sender endRefreshing];
    [[DataModel sharedMyLibrary] clear];
    [self fetchVideos:YES];
}
- (void)fetchVideos:(BOOL)reload
{
    if (OSAtomicTestAndClear(0, &(_canFetch)))
    {
        __weak typeof(self) weakSelf = self;
        [[DataModel sharedMyLibrary] fetchWithCompletion:^(NSArray *indexPathes) {
            dispatch_async(dispatch_get_main_queue(), ^{
                __strong typeof(self) strongSelf = weakSelf;
                if (indexPathes != nil)
                {
                    if (reload)
                    {
                        [[strongSelf tableView] reloadData];
                    }
                    else
                    {
                        [[strongSelf tableView] beginUpdates];
                        [[strongSelf tableView] insertRowsAtIndexPaths:indexPathes withRowAnimation:UITableViewRowAnimationAutomatic];
                        [[strongSelf tableView] endUpdates];
                    }
                }
                else
                {
                    [[strongSelf tableView] reloadData];
                }
                [strongSelf->_hasMore setHidden:![[DataModel sharedMyLibrary] hasMore]];
                strongSelf->_canFetch = 0x80;
            });
        }];
    }
}

``

person Alexey Lobanov    schedule 19.02.2016
comment
Вопрос принадлежит Swift, поэтому, пожалуйста, не публикуйте ненужный код. Если у вас есть код Swift, используйте его, иначе удалите ответ - person Sohil R. Memon; 19.02.2016
comment
@SohilR.Memon, парень пытается помочь, да, это не Swift, но логика та же. - person 0yeoj; 19.02.2016
comment
@0yeoj Но все же парень только что опубликовал полный код, как человек поймет. Если он/она пытается объяснить логику, то в ответе следует упомянуть только эту часть. Мое намерение состоит в том, чтобы просто решить проблему человека, который задает вопрос. Впрочем, без обид! - person Sohil R. Memon; 19.02.2016
comment
@SohilR.Memon, у него есть подпись выше. Но я понимаю, что вы имеете в виду, он мог бы добавить комментарии и объяснить, что происходит. (Что, если человек, который спрашивает, ничего не знает о ObjC), по крайней мере, мы указываем на это... Ура! ;) - person 0yeoj; 19.02.2016