2016-02-19 5 views
11

Próbuję zaimplementować ładowanie danych z mojego backendu za pomocą stronicowania. Widziałem to, ale ładuje wszystkie dane, cały czas. Czy to jest właściwa droga, czy robię coś złego?UITableView Paginacja - od dołu Odśwież, aby załadować nowe dane w Swift

Z góry dziękuję.

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 
} 

Odpowiedz

29

Nie, nie możesz iść z tym podejściem, ponieważ cellForRowAtIndexPath nazywa się wielokrotnie, a także zajmie dużo czasu, aby sprawdzić swoje warunki!

Tutaj znalazłem lepszą opcję dla paginacji 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 jest Bool aby sprawdzić, czy UITableView się ładuje nowe dane, czy nie!

Mam nadzieję, że to pomoże!

+0

Nie działa w Swift 4 –

+0

@UtkuDalmaz Czy możesz mi powiedzieć, co dokładnie nie działa? –

+0

Operator binarny "==" nie może być zastosowany do argumentów typu "UIScrollView" i "_" –

1

Spróbuj sprawdzić więcej danych nie w cellForRowAtIndexPath ale w UIScrollViewDelegate - [DataModel sharedMyLibrary] jest moje źródło danych klasy ładowanie danych wideo przy użyciu REST API z paginacji, to metoda fetchWithCompletion pobrać dane z serwera w async, to metoda hasMore mówi, że serwer ma więcej danych (JSON zawiera następny link) LibraryTableViewController - jest podklasą UITableViewController, hasMore - jest widokiem w dolnej części widoku tabeli w storyboardzie zawierającym przycisk, więc użytkownik ma dwie opcje: przewiń w dół lub naciśnij przycisk. Również jeśli ten widok jest widoczny, oznacza to, że na serwerze jest więcej danych. _canFetch zapobiega załadowaniu zagnieżdżonemu z serwera.

`

@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

Pytanie należy do 'Swift', więc nie publikuj niepotrzebnego kodu. Jeśli masz kod 'Swift', przejdź do niego, w przeciwnym razie usuń odpowiedź –

+0

@ SohilR.Memon, facet próbuje pomóc, tak, to nie jest' Swift' ale logika z tyłu jest taka sama. – 0yeoj

+0

@ 0yeoj Ale nadal facet właśnie opublikował kompletny kod, jak dana osoba zrozumie. Jeśli on/ona próbuje wyjaśnić logikę, tylko ta część powinna być wymieniona w odpowiedzi. Moją intencją jest właśnie rozwiązać problem osoby, która zadaje pytanie. Bez obrazy! –

5

Należy wdrożyć obciążenie więcej w tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath). Kiedy wyświetla się ostatnie ładowanie komórki, oznacza to, że użytkownik przewija do dołu, więc czas, aby załadować więcej danych.

Może wygląda to tak:

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

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

    } 
} 
Powiązane problemy