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