2016-02-19 2 views
11

Ich versuche, Ladedaten aus meinem Backend mit Seitenumbruch zu implementieren. Ich habe das gesehen, aber es lädt alle Daten, dann die Zeit. Ist das der richtige Weg oder mache ich etwas falsch?UITableView Paginierung - Bottom Refresh zum Laden neuer Daten in Swift

Vielen Dank im Voraus.

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 
} 

Antwort

29

Nein, kann man nicht mit diesem Ansatz gehen, weil cellForRowAtIndexPath oft genannt wird, und auch wird es viel Zeit in Anspruch nehmen Ihre Bedingungen zu überprüfen!

Hier habe ich eine bessere Option für UITableView Paginierung gefunden.

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 ist Bool dass UITableView wird das Laden neuer Daten zu überprüfen oder nicht!

Hoffe, das hilft!

+0

Funktioniert nicht in Swift 4 –

+0

@UtuDalmaz Können Sie mir bitte sagen, was genau nicht funktioniert? –

+0

Binärer Operator '==' kann nicht auf Operanden vom Typ 'UIScrollView' und '_' angewendet werden –

1

versuchen, mehr Daten zu überprüfen nicht in cellForRowAtIndexPath aber in UIScrollViewDelegate zu - [Datamodel sharedMyLibrary] meine Datenquelle Videodaten Laden von Klassen mit RESTful API mit Paginierung ist, dann ist es fetchWithCompletion Methode in Asynchron-Daten vom Server holt, dann ist es hasMore Methode sagt, dass der Server mehr Daten hat (JSON enthält den nächsten Link) LibraryTableViewController - ist eine Unterklasse des UITableViewControllers, hasMore - ist die Ansicht am unteren Ende der Tabellenansicht im Storyboard, die eine Schaltfläche enthält, sodass der Benutzer zwei Optionen hat: scrollen Sie nach unten oder drücken Sie die Taste. Wenn diese Ansicht sichtbar ist, bedeutet dies auch, dass auf dem Server mehr Daten vorhanden sind. _canFetch verhindert das geschachtelte Laden vom 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

Die Frage gehört zu 'Swift' also bitte keine unnötigen Code schreiben. Wenn Sie den 'Swift' Code haben, dann gehen Sie dafür, sonst löschen Sie die Antwort –

+0

@ SohilR.Memon, der Typ versucht zu helfen, ja, es ist nicht' Swift', aber die Logik dahinter sind die gleichen. – 0yeoj

+0

@ 0yeoj Aber immer noch der Typ hat nur den vollständigen Code, wie die Person verstehen wird. Wenn er versucht, die Logik zu erklären, dann sollte nur dieser Teil in der Antwort erwähnt werden. Meine Absicht ist, das Problem nur von der Person zu lösen, die die Frage stellt. Nichts für ungut, obwohl! –

5

Sie sollten Last mehr in tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) implementieren. Wenn das Laden der letzten Zelle angezeigt wird, bedeutet dies, dass der Benutzer nach unten scrollt, also ist es an der Zeit, dass Sie mehr Daten laden müssen.

Vielleicht sieht es wie folgt aus:

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

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

    } 
}