2017-08-09 2 views
0

Ich habe derzeit ein Xcode-Projekt, das Daten lädt und sie in Arrays platziert, die sortiert und auf einer Tabelle platziert werden. Ab jetzt, wenn ich im viewDidLoad() Teil zum Tisch gehe, habe ich eine Funktion, die alle Daten sammelt, die ich brauche. Aber um die App nicht abstürzen zu lassen, wird ein Limit von 30 geladen. Mein derzeitiges Problem ist, dass, sobald der Benutzer durch die 30 Elemente scrollt, ich möchte, dass 30 weitere unterhalb der anfänglich 30 geladen werden (Standard Scrolling). Der einzige Weg, um darüber nachzudenken, ist das Nachladen des ganzen Tisches, der nicht sehr schlau ist.Laden während des Scrollens wie Instagram oder irgendeine App

Ich möchte nur eine Standard-Scroll-Funktion, die Sie in Apps wie Instagram, Facebook oder einer beliebigen Internet-App sehen, die Daten in eine Tabellenansicht lädt. Während der Benutzer scrollt, werden mehr Daten am unteren Rand hinzugefügt. Im Folgenden werde ich das ich meinen Code kopiert haben verwenden, um die ursprünglichen Daten zu sammeln:

func findAnimalUsers() { 
     //STEP 1: Find users 
       let animalQuery = PFQuery(className: "Animals") //choosing class 
       animalQuery.whereKey("dog", equalTo: animalType.text!) //getting users with animal type user types 
       animalQuery.limit = 30 //number of users intitally showing 
       animalQuery.findObjectsInBackground (block: { (objects, error) -> Void in 
        if error == nil { //if no error 

         //clean up 
         self.animalArray.removeAll(keepingCapacity: false) 

         //STEP 2: Find related objects depending on query setting 
         for object in objects! { 
          self.animalArray.append(object.value(forKey: "user") as! String) //objectId of related users 
         } 

         //STEP 3: Find users 
         let query = PFUser.query() 
         query?.whereKey("objectId", containedIn: self.animalArray) //finding users 
         query?.addDescendingOrder("createdAt") //how to order users 
         query?.findObjectsInBackground(block: { (objects, error) -> Void in 
          if error == nil { 

           //clean up 
           self.usernameArray.removeAll(keepingCapacity: false)             

           self.profilePhotoArray.removeAll(keepingCapacity: false) 
           self.objectIDArray.removeAll(keepingCapacity: false) 

           //find related objects depending on query setting 
           for object in objects! { 
            self.usernameArray.append(object.object(forKey: "username") as! String) 
            self.profilePhotoArray.append(object.object(forKey: "profilePhoto") as! PFFile) 
            self.objectIDArray.append(object.objectId!) 

           } 
          } else { 
           print(error) 
          } 
         }) 
        } else { 
         print(error) 
        } 
       }) 
      } 

ich auch den Code hinzugefügt haben, wie die Tabelle wird diese Informationen benutzen:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     //define cell 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! AnimalsCell 

     //STEP 1: connect data from server to objects 
     cell.usernameLabel.text = usernameArray[indexPath.row] 
     cell.objectID = objectIDArray[indexPath.row] 
     profilePhotoArray[indexPath.row].getDataInBackground (block: { (data, error) in 
      if error == nil { 
       cell.profilePhoto.image = UIImage(data: data!)     
      } else { 
       print(error) 
      }    
     }) 

Also, wenn diese View-Controller kommt In viewDidLoad() habe ich findAnimalUsers() gefunden, um den initialen Ladevorgang zu starten. Wie lade ich mehr beim Scrollen herunter ???

+0

einen Blick auf https://github.com/pronebird/ UIScrollView-InfiniteScroll –

Antwort

1

Sie Delegatmethode von Scrollview verwenden können

func scrollViewDidScroll(_ scrollView: UIScrollView) 
{ 
    let offsetY = scrollView.contentOffset.y 
    let contentHeight = scrollView.contentSize.height 
    let scrollHeight = scrollView.frame.size.height 
    if offsetY >= contentHeight - scrollHeight 
    { 
     //your logic 
    } 
} 
+0

Ich habe versucht, mit dieser und in meiner Logik Ich überspringe die Abfrage um die Anzahl der Elemente im Array, die darüber entscheiden, wie viele Zeilen in der Tabelle enthalten sein sollen. Aber wenn ich scrolle, lädt es mehrere Duplikate. 'animalQuery.skip = objectIDArray.count' Wie repariere ich das ??? – fphelp

+0

@fphelp In Ihrem Fall sollte objectId eindeutig sein. Wenn Sie also Ihre letzte Objekt-ID scrollen, wird Ihre erste für die nächsten 30 Daten sein. Wie wenn Sie jetzt die letzte objectId 30 haben, dann werden Sie in Ihrem nächsten Bildlauf Daten von objectId 31 laden und dann werden Sie Daten in Array anhängen und Tabelle nach dem Anhängen von Daten neu laden, so dass Sie keine doppelten Daten bekommen. –

+0

Hmm. Ich bin mir nicht sicher, ob ich verstehe, was du zu sagen versuchst. Um die Anzahl der Zeilen zu erhalten, die in der Tabelle benötigt werden, zählt es die Objekte im Array 'objectIDArray.count'. ** Soll der Code nicht durch das gleiche Array übersprungen werden, das ich zum Auffüllen der Zeilenanzahl verwendet habe? ** – fphelp

1

Sie können ganz einfach tun, dass mit dem Delegatmethode von tableView

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

    if indexPath.row == lastElement { 
     // handle your logic here to get more items, add it to dataSource and reload tableview 
    } 
} 
+0

Ich habe versucht, dies zu implementieren, aber der Build schlägt fehl und es markiert 'lastElement' mit dem Fehler:" Verwendung des nicht aufgelösten Bezeichners 'lastElement' "Wie kann ich das beheben? – fphelp

+0

lastElement ist nur eine Referenz hier, Sie müssen zuerst in Ihrem Code definieren und es auf den letzten Indexpfad aus der Liste Ihrer Elemente festlegen. –

+0

Kurz gesagt lastElement = .count und das müssen Sie global in Ihrer Klasse definieren. –

Verwandte Themen