web-dev-qa-db-fra.com

Pagination UITableView - Rafraîchissement inférieur pour charger de nouvelles données dans Swift

J'essaie d'implémenter le chargement des données de mon backend avec pagination. J'ai vu cela, mais il charge toutes les données, tout le temps. Est-ce la bonne façon ou est-ce que je fais quelque chose de mal?

Merci d'avance.

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
}
13
Chris G.

Non, vous ne pouvez pas suivre cette approche car cellForRowAtIndexPath est appelé plusieurs fois et il faudra également beaucoup de temps pour vérifier vos conditions!

Ici, j'ai trouvé une meilleure option pour la pagination 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 est Bool pour vérifier que UITableView charge ou non de nouvelles données!

J'espère que cela t'aides!

34
Sohil R. Memon

Vous devez implémenter load more dans tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath). Lorsque le dernier chargement de cellule est affiché, cela signifie que l'utilisateur fait défiler vers le bas, il est donc temps que vous ayez besoin de charger plus de données.

Peut-être que cela ressemble à ceci:

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

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

    }
}
5
vien vu

Essayez de vérifier plus de données pas dans cellForRowAtIndexPath mais dans UIScrollViewDelegate - [DataModel sharedMyLibrary] est ma classe de source de données chargeant des données vidéo à l'aide de l'API RESTful avec pagination, c'est la méthode fetchWithCompletion récupérer les données du serveur dans async, sa méthode hasMore indique que le serveur a plus de données ( JSON contient le lien suivant) LibraryTableViewController - est une sous-classe de UITableViewController, hasMore - est la vue en bas de la vue de table dans le storyboard contenant un bouton, donc l'utilisateur a deux options: faites défiler vers le bas ou appuyez sur le bouton. De plus, si cette vue est visible, cela indique qu'il y a plus de données sur le serveur. _canFetch empêche le chargement imbriqué à partir du serveur.

''

@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;
            });
        }];
    }
}

''

1
Alexey Lobanov