2016-07-25 14 views
1

Ich habe mein 2D-Array-Datenmodell nach dem Beispiel des GroupedTableView-Beispiels von Realm strukturiert. Ich versuche jedoch, die Funktion zu implementieren, um Aufgaben in meinem tasksByPriority-Array neu zu ordnen, und bin mir nicht sicher, wie in einem bestimmten Array eingefügt werden soll. Momentan wird das Array "Realm Results" nach dateCreated sortiert und ich weiß nur, wie ich Realms am Ende des Realm-Objekts und nicht bei einem bestimmten Index neue Aufgaben hinzufügen kann.Wie fügt man ein Objekt in einen bestimmten Index in einem Realm-Array ein?

import UIKit 
import MGSwipeTableCell 
import RealmSwift 
import Realm 
import AEAccordion 

class TasksTableViewController: UITableViewController { 

    var realm: Realm! 
    var notificationToken: NotificationToken? 
    var priorityIndexes = [0, 1, 2, 3] 
    var priorityTitles = ["Urgent | Important", "Urgent | Not Important", "Not Urgent | Important", "Not Urgent | Not  Important"] 
    var tasksByPriority = [Results<Task>]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     realm = try! Realm() 

     notificationToken = realm.addNotificationBlock { [unowned self] note, realm in 
      self.tableView.reloadData() 
     } 

     for priority in priorityIndexes { 
      let unsortedObjects = realm.objects(Task.self).filter("priorityIndex == \(priority)") 
      let sortedObjects = unsortedObjects.sorted("dateCreated", ascending: true) 
      tasksByPriority.append(sortedObjects) 
     } 
    } 


    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return priorityIndexes.count 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return Int(tasksByPriority[section].count) 
    } 


    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
     return priorityTitles[section] 
    } 


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("taskTableViewCell", forIndexPath: indexPath) as! TaskTableViewCell 

     // Configure the cell... 
     let task = self.taskForIndexPath(indexPath) 

      //configure right buttons 
     cell.rightButtons = [MGSwipeButton(title: "", icon: UIImage(named:"deleteTask.png"), backgroundColor: UIColor(red: 0, green: 0, blue: 0, alpha: 0), callback: { 
       (sender: MGSwipeTableCell!) -> Bool in 
       RealmHelper.deleteTask(self.taskForIndexPath(indexPath)!) 
       return true 
     })] 

     return cell 
    } 

    func taskForIndexPath(indexPath: NSIndexPath) -> Task? { 
     return tasksByPriority[indexPath.section][indexPath.row] 
    } 


    // MARK: Segues 

    @IBAction func unwindToTasksTableViewController(sender: UIStoryboardSegue) { 
     if let sourceViewController = sender.sourceViewController as? DisplayTaskViewController, task = sourceViewController.task, priorityIndex = sourceViewController.priorityIndex { 
      if let selectedIndexPath = tableView.indexPathForSelectedRow { 
       // Update an existing task. 
       if selectedIndexPath.section == priorityIndex { // not changing priority 
        RealmHelper.updateTask(taskForIndexPath(selectedIndexPath)!, newTask: task) 
       } 

       else { // changing priority 
        RealmHelper.addTask(task) 
        RealmHelper.deleteTask(taskForIndexPath(selectedIndexPath)!) 
       } 
      } 
      else { 
       RealmHelper.addTask(task) 
      } 
     } 

    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if let identifier = segue.identifier { 

      if identifier == "editTaskDetailsSegue" { 
       let displayTaskViewController = segue.destinationViewController as! DisplayTaskViewController 

       // set task of DisplayTaskViewController to task tapped on 
       if let selectedTaskCell = sender as? TaskTableViewCell { 
        let indexPath = tableView.indexPathForCell(selectedTaskCell)! 
        let selectedTask = taskForIndexPath(indexPath) 
        displayTaskViewController.task = selectedTask 
        print("Task completed: \(selectedTask!.completed)") 
        displayTaskViewController.priorityIndex = indexPath.section 
        displayTaskViewController.completed = (selectedTask?.completed)! 
       } 
      } 

      else if identifier == "addNewTaskSegue" { 
      } 
     } 
    } 
} 

Realm Helper Klasse

import Foundation 
import RealmSwift 

class RealmHelper { 

static func addTask(task: Task) { 
    let realm = try! Realm() 
    try! realm.write() { 
     realm.add(task) 
    } 
} 



static func deleteTask(task: Task) { 
    let realm = try! Realm() 
    try! realm.write() { 
     realm.delete(task) 
    } 
} 

static func updateTask(taskToBeUpdated: Task, newTask: Task) { 
    let realm = try! Realm() 
    try! realm.write() { 
     taskToBeUpdated.text = newTask.text 
     taskToBeUpdated.details = newTask.details 
     taskToBeUpdated.dueDate = newTask.dueDate 
     taskToBeUpdated.completed = newTask.completed 
    } 
} 
} 
+1

Sind alle ~ 400 Zeilen Code wirklich relevant für Ihre Frage? Können Sie den Code verkleinern, um die für Ihre Frage relevanten Bereiche besser hervorzuheben? – bdash

+0

Vielen Dank, dass Sie sich die Zeit genommen haben, meine Frage zu beantworten. Ich merke jetzt, dass der unnötige Code in meiner Klasse unvorsichtig war und ich ihn entfernt habe, so dass nur die Methoden und Variablen meines Realm-Array-Datenmodells übrig blieben. Im Wesentlichen bin ich mir nicht sicher, wie das Array "tasksByPriority results" übermäßig "magisch" sortiert wird. Ich lösche oder füge eine Aufgabe hinzu, wenn ich nur die Filterung und Sortierung in der viewDidLoad() - Konfiguration vorgenommen habe. Das führt zu meiner Hauptfrage, wie ich eine Aufgabe in einen bestimmten Index einfügen kann (zum Zweck der Neuordnung von Aufgaben), wenn das Hinzufügen einer Aufgabe zu Realm keinen Index erlaubt. – Reservations

Antwort

2

TL; DR

Objekte in Realm ungeordnet sind. Wenn Sie die Objekte sortieren möchten, geben Sie List<T> ein. A List kann mutiert werden, können Sie insert(_:atIndex:), removeAtIndex(_:) und so weiter. Hier ist die List Class Reference, wo Sie herausfinden können, wie Sie es verwenden.

+0

Danke! Das hat den Trick gemacht. Als Referenz habe ich meinen Code nach der TableViewController-Klasse im ReactKit-Ordner des Beispiels Realm Swift-Code, der hier gefunden wurde, umgestaltet: https://github.com/realm/realm-cocoa – Reservations