2016-06-06 9 views
0

Ich suche nach einem ähnlichen Szenario, aber ich kann nichts finden, das alle Funktionen enthält, die ich brauche. Als ich mich umschaute, schrieb ich die Implementierung der Methode moveRowAtIndexPath wie folgt, aber ich habe ein Problem mit dem Ändern der Referenz auf die Coredata-Objekte, wenn ich also done nothing drücke, wird nichts auf Coredata gespeichert.UITableView CoreData Bestellung mit Abschnitten

override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { 
    userDrivenDataModelChange = true; 

    if (sourceIndexPath == destinationIndexPath) { 
     return 
    } 

    let rooms = fetchedResultsController.sections! 

    let sourceRoom = rooms[sourceIndexPath.section] 
    let destinationRoom = rooms[destinationIndexPath.section] 

    var sourceLights = sourceRoom.objects as! [Light] 
    var destinationLights = destinationRoom.objects as! [Light] 
    let light = sourceLights[sourceIndexPath.row] 

    sourceLights.removeAtIndex(sourceIndexPath.row) 
    destinationLights.insert(light, atIndex: destinationIndexPath.row) 

    (destinationLights as NSArray).enumerateObjectsUsingBlock({ object, index, stop in 
     let light = object as! Light 
     light.position = index 
    }) 

    tableView.reloadData() 

    Utils.saveContext(getAppDelegate().context) 

    userDrivenDataModelChange = false; 
} 

Antwort

1

Der Teil, den neuen Raum zu dem Artikel einstellen fehlte, die ich bewegen würde. Etwas wie:

item.relationRoom = <destination room object> 

Auch braucht es einige Anpassungen, wenn Sie ein Licht im selben Raum bewegen.

0

Ihr Code ist unnötig komplex. Sie können das Lichtobjekt in einer Linie erhalten.

let light = fetchedResultsController.objectAtIndexPath(sourceIndexPath) as! Light 

die position Eigenschaft des Lichts Aktualisierung ist tatsächlich etwas, das IMO zur Room Klasse gehört. Sie sollten Komfortmethoden schreiben, die alle relevanten Lichtinstanzen neu nummerieren, wenn Sie Lichtobjekte hinzufügen und entfernen (und möglicherweise auch verschieben).

Beachten Sie, dass Sie könnte dies auf zwei verschiedenen Räumen haben anzurufen, wenn ein Licht in einen anderen Raum bewegt wird (das heißt, die Quell- und Ziel-Indexpfade haben unterschiedliche Abschnitte).

Sie müssen auch nicht müssen die gesamte Tabellenansicht neu laden. Das ist völlig überflüssig und schlechtes UX, wenn du nicht schon ganz oben in der Tabelle bist.

Bitte beachten Sie, dass in Ihrem Code Sie ändern nur die sections Array aus der abgerufenen Ergebnisse Controller. Um die Kerndaten zu sichern, müssen Sie die Beziehungen ändern (vermutlich Room) und speichern.

+0

Guter Tipp über das Erhalten des hellen Gegenstandes. Aber über die Bestellung geschieht dies bereits über die enumerateObjectsUsingBlock Methode, aber die Änderung beibehalten wird nicht irgendwie zu Coredata, ist vielleicht, dass das Objekt von Coredata gelöst ist, und wenn ja - wie es zu lösen? – DeejonZ

+0

Dieser Code gehört nicht in einen View-Controller. Sie sollten meiner Empfehlung folgen. – Mundi

+0

ok, hast du ein beispiel? Ich verstehe immer noch nicht, wie ich meinen Code zum Laufen bringen kann. – DeejonZ