2016-07-25 83 views
1

我已經通過Realm的GroupedTableView示例提供的示例構建了我的二維數組數據模型。但是,我試圖實現這個功能來重新排序我的tasksByPriority數組中的任務,並且我不確定如何去插入特定的數組。目前,Realm Results數組正在按dateCreated進行排序,我只知道如何在Realm對象的末尾添加新任務給Realm,而不是在特定索引處。如何在Realm數組中的特定索引處插入對象?

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" { 
      } 
     } 
    } 
} 

境界助手類

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

所有400行代碼是否真的與您的問題相關?你能否削減代碼以更好地突出與你的問題相關的部分? – bdash

+0

感謝您花時間回答我的問題。我現在意識到,在我的類中留下所有不必要的代碼是粗心的,我已經刪除它,只留下與我的Realm陣列數據模型相關的方法和變量。基本上我不確定tasksByPriority結果數組是如何「神奇地」排序超時我刪除或添加一個任務,當我只在viewDidLoad()設置過濾和排序。這導致我的主要問題是,如果向Realm「添加」任務不允許索引,我可以將任務插入某個索引(用於重新排序任務)。 – Reservations

回答

2

TL; DR在境界

對象是無序的。如果您確實想要排列對象,則可以使用List<T>類型。 A List可以進行突變,可以是insert(_:atIndex:),removeAtIndex(_:)等。這裏是List Class Reference,你可以在這裏找到如何使用它。

+0

謝謝!這個伎倆。作爲參考,我在ReactKit文件夾中的示例Realm swift代碼的TableViewController類之後對代碼進行了重新編譯:https://github.com/realm/realm-cocoa – Reservations

相關問題