2016-05-19 4 views
0

Ich habe eine UIScrollView innerhalb tgat Ich habe eine UITableView. Ich habe Scrolling für die UITableView deaktiviert Also ich möchte nur überprüfen, ob meine Bildlauf-Ansicht nach unten erreicht hat, wenn so laden Sie mehr Tabellenfunktion. Also habe ich so etwas gemacht.scrollViewDidScroll Anruf mehrere Male in Swift

func scrollViewDidScroll(scrollView: UIScrollView) { 



     if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) { 
      //reach bottom 
      self.startRec+=10 
      self.jsonParser() 
     } 

     else if (scrollView.contentOffset.y < 0){ 
      //reach top 
     } 

     else if (scrollView.contentOffset.y >= 0 && scrollView.contentOffset.y < (scrollView.contentSize.height - scrollView.frame.size.height)){ 
      //not top and not bottom 
     } 
} 

Aber mein Problem ist es seine scheint dieses jsonParser() mehrmals aufrufen, wenn ich es durchgeblättert. Wie kann ich dieses Problem lösen? Bitte hilf mir. Danke

+0

Die Methode scrollViewDidScroll wird beim Scrollen mehrfach aufgerufen, und wenn Ihre Methode jsonParser nur einmal ausgeführt werden soll, sollten Sie ein boolesches Flag verwenden und auf yes setzen, wenn Ihre Methode zuerst ausgeführt wird. –

Antwort

0

Sie könnten der Klasse eine Instanzvariable hinzufügen, um zu verfolgen, wann jsonParser ausgeführt wird. Wenn es bereits läuft, kehren Sie zurück, ohne etwas zu tun. Sie müssten startRec nur erhöhen, wenn der jsonParser noch nicht ausgeführt wird. Etwas wie:

func incrementAndParseJSON() { 
    if self.alreadyRunning == false { 
     self.alreadyRunning = true 
     self.startRec += 10 
     self.jsonParser() 
     // Presumably, jsonParser is asynchronous, so set self.alreadyRunning = false after it's done. 
    } 
} 
0

Haben Sie einen Grund, eine Tabellenansicht in einer Bildlaufansicht zu untersuchen? Ich meine, Tabellenansichten sind eine Unterklasse von scrollview, und einer der Hauptvorteile der Verwendung von TableView ist die dequeueCell-Methode.

Sie könnten eine bessere Leistung aus Ihrer Anwendung erhalten, indem nur die Tableview platzieren, wo Sie es in Ihrem View-Controller wollen und dann die Funktion Delegierten mit

func Tableview (_: willDisplayCell: forRowAtIndexPath :)

innerhalb dieses Delegatmethode könnten Sie Ihre jsonParser, wenn die Zelle in Sicht ist zu sagen, kommt rufen 3-5 Indizes ab Ende Ihrer Datenquelle

func tableView(_:willDisplayCell:forRowAtTndexPath:) { 
    if (indexPath.row == resultsArray.count - 3) { 
     //load your extra data 

     self.startRec+=10 
     self.jsonParser() 
    } 

natürlich können Sie diese Nummer ändern könnte 3 bis was auch immer Sie w ish, aber das würde eine Situation verursachen, in der Ihr jsonParser() nur aufgerufen wird, wenn sich die Tabelle dem Ende Ihrer Datenquelle nähert und Sie die Vorteile der Verwendung der Warteschlange für die Warteschlange erhalten. Hier

ist der Link zu Apples docs, wenn Sie es als Referenz wollen: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/#//apple_ref/occ/intfm/UITableViewDelegate/tableView:willDisplayCell:forRowAtIndexPath:

ich verwenden, um diesen gleichen Ansatz zu einer Sammlung Ansicht Ich war für unendliche Scrollen zu schaffen.

-(void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.item == self.arrCollectionData.count - 5) { 
     [self.myWebService startWebServiceRequestWithURL:_currentURL]; 
    } 
} 
+0

Ich habe auch das gleiche Problem, ich habe es versucht, aber WillDisplayCell Methode für den letzten Artikel wird aufgerufen, auch wenn mein erstes Element auf dem Bildschirm @JacobBoyd angezeigt wird –

0

Die UIScrollViewDelegate Methoden mehrmals erhalten aufgerufen, wenn der Benutzer initiiert, schleppt, und hebt dann ihre Finger von ihrem Gerät. Sie sollten wahrscheinlich nach einem vorhandenen Parser suchen, und wenn einer vorhanden ist, kehren Sie einfach zurück, anstatt einen neuen auszuführen.

Innerhalb von jsonParser():

func jsonParser() { 

    if /* JSON is in process */ { 
     return 
    } 

    // process then clean up 

} 

Dadurch wird Ihr Code aus dem Brennen mehrmals zu verhindern. Stellen Sie sicher, dass Sie Ihren Status korrekt verwalten.