2016-02-19 20 views
11

Sto cercando di implementare i dati di caricamento dal mio backend con l'impaginazione. Ho visto questo, ma carica tutti i dati, tutto il tempo. È questo il modo giusto o sto facendo qualcosa di sbagliato?Impaginazione UITableView - Aggiornamento inferiore per caricare nuovi dati in Swift

Grazie in anticipo.

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 
} 

risposta

29

No, non si può andare con questo approccio perché cellForRowAtIndexPath è chiamato molte volte e anche che ci vorrà molto tempo per controllare le vostre condizioni!

Qui, ho trovato un'opzione migliore per l'impaginazione 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 per controllare che UITableView sta caricando i nuovi dati o no!

Spero che questo aiuti!

+0

Non funziona in Swift 4 –

+0

@UtkuDalmaz Puoi dirmi che cosa non funziona esattamente? –

+0

L'operatore binario '==' non può essere applicato agli operandi di tipo 'UIScrollView' e '_' –

1

tenta di controllare più dati non in cellForRowAtIndexPath ma in UIScrollViewDelegate - [DataModel sharedMyLibrary] è la mia fonte di dati di classe caricamento dati video utilizzando API RESTful con impaginazione, è il metodo fetchWithCompletion recuperare i dati dal server asincrona, è il metodo hasMore dice che il server ha più dati (JSON contiene il prossimo link) LibraryTableViewController - è una sottoclasse di UITableViewController, hasMore - è la vista nella parte inferiore della vista tabella nello storyboard contenente un pulsante, quindi l'utente ha due opzioni: scorrere verso il basso o premere il tasto pulsante. Inoltre, se questa vista è visibile indica che ci sono più dati sul server. _canFetch impedisce il caricamento nidificato dal server.

``

@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

La domanda appartiene a 'Swift' quindi si prega di non pubblicare codice non necessario. Se hai il codice 'Swift', fallo, altrimenti cancella la risposta –

+0

@ SohilR.Memon, il tizio sta cercando di aiutare, sì non è' Swift' ma la logica dietro è la stessa. – 0yeoj

+0

@ 0yeoj Ma ancora il ragazzo ha appena pubblicato il codice completo, come la persona capirà. Se lui/lei sta cercando di spiegare la logica, allora solo quella parte dovrebbe essere menzionata nella risposta. La mia intenzione è di risolvere il problema della persona che sta facendo domande. Senza offesa, però! –

5

è necessario implementare carico più tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath). Quando viene visualizzato l'ultimo caricamento della cella, significa che l'utente scorre verso il basso, quindi è il momento di caricare più dati.

Forse assomiglia a questo:

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

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

    } 
}