2015-06-09 12 views
7

ich Benutzer lassen in tableView Reihen neu zu ordnen. Da dieses Ereignis Inhalt betrifft - sollten einige numerischen Werte in Zellen aktualisiert werden - in allen anderen Reihen, ich reloadData in moveRowAtIndexPath nennen. Und dann treten seltsame Effekte auf.Wie nachladen nach Tableview eine Zeile Nachbestellung? Zeilen variabler Höhe

I.e. Die Zellen scheinen sich beim Berühren des Draggers zu überlappen, und einige Zellen beginnen sich auf und ab zu bewegen. Es ist wichtig zu wissen, dass die Höhe der Zellen variiert.

Das seltsame, dass, wenn ich reloadData von moveRowAtIndexPath entfernen, dann verschwinden alle diese Phänomene. Nur der Inhalt ist ungültig.

Also, wie soll ich Daten nach der Neuordnung neu laden?


UPDATE: Was habe ich inzwischen Neukonfiguration Zellen in viewDidLayoutSubviews statt Anruf reloadData Ende des moveRowAtIndexPath getan. Und es funktioniert 90% wie ich es erwarte, aber immer noch sind Zeilen manchmal etwas höher, die sie sollten.

override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { 

    //.. 

    reorderOccured = true 
} 

override func viewDidLayoutSubviews() { 

    if reorderOccured { 

     for cell in tableView.visibleCells() as! [UITableViewCell] { 

      let ip = tableView.indexPathForCell(cell) 
      if ip != nil { 
       self.configureCell(cell, indexPath: ip!) 
      } 
     } 

     reorderOccured = false 
    } 
} 
+0

Sie könnten dies auch interessant finden: http://stackoverflow.com/questions/30758111/an-extra-view-appears-in-cell-when-pressing-reorder-dragger-why –

Antwort

3

Ich fand hier die Antwort: https://stackoverflow.com/a/4692563/239219

[tableView beginUpdates]; 
[tableView endUpdates]; 

Diese UITableView Code Kräfte nur Zellgrößen neu zu laden, aber nicht Inhalt der Zelle.

+0

Dies wurde auch in diesem Jahr WWDC während Cocoa Touch Best Practices http://asciiwwdc.com/2015/sessions/231?q=cocoa%20touch%20best%20practices erwähnt –

2

Sie sollten nicht reloadData nach Reorder aufrufen. Sie müssen die gleichen Änderungen an Ihren Daten machen, da die Änderungen, die auf dem Bildschirm vorgenommen wurde. Zum Beispiel: wenn Sie Zelle Nr. 2 auf Position 6 verschoben haben, müssen Sie Ihr Objekt entfernen, das Zelle Nr.2 füllt und es erneut an Position 6 einfügt. Sie haben nicht genügend Details angegeben, aber normalerweise behalten Sie Ihre Daten in einem Array von Objekten. In diesem Array müssen Sie die Änderungen vornehmen, damit Ihre Backing-Datenquelle gültig ist.

Hier ist ein link zu Details von Apple.

Ich lese gerade die aktualisiert, nachdem ich meine Antwort gepostet. Es scheint, als ob Sie wirklich reloadData brauchen. In diesem Fall empfehle ich, nach einer kleinen Verzögerung mit einem dispatch_async Block auf dem Hauptthread neu zu laden. Sprich nach 0.1.

+0

, wenn Sie die UPDATE- lesen Ed-Teil, rufe ich 'reloadData' nicht mehr auf, sondern rufe' reconfigureCell' für jede Zelle in 'viewDidLayoutSubviews' auf, aber manchmal bekomme ich ein überlappendes Phänomen –

+0

verwendest du dieselbe Zelle für unterschiedliche Höhen?dann ist es der Grund –

+0

in Bezug auf den Artikel, den Sie verknüpft haben, wenn Zeilen die gleiche Höhe dann ** überlappendes Phänomen nicht erhöhen ** –

0

Ich kann die Antwort von pteofil noch nicht kommentieren, aber er ist richtig: Wenn Sie eine nummerierte Reihe von Zeilen in einer Tabelle haben, und Sie einen moveRow aufrufen (...), wird Ihre Animation für den Umzug sein abgebrochen durch eine tableView.ReloadData().

Als solche verzögerte ich die Daten neu laden (die nummeriert alle sichtbaren Zellen auf der Grundlage der aktualisierten Datenquelle (nicht vergessen, das zu tun, wenn Sie Sachen bewegen)) ein paar hundert Millisekunden und es funktioniert perfekt jetzt und sieht auch gut aus.

Verwandte Themen