Created
July 27, 2016 04:51
-
-
Save kishikawakatsumi/cc4a1f32fb8ee34eb509d54027d731b5 to your computer and use it in GitHub Desktop.
Reorder Realm Results in UITableView
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
import RealmSwift | |
class Data: Object { | |
dynamic var name = "" | |
... | |
dynamic var order = 0 // 並べ替えのためのカラムが必要 | |
} | |
class ViewController: UITableViewController { | |
lazy var realm = try! Realm() | |
var objects: Results<Data>! | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
objects = realm.objects(Data.self).sorted("order") | |
} | |
override func numberOfSectionsInTableView(tableView: UITableView) -> Int { | |
return 1 | |
} | |
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { | |
return objects.count | |
} | |
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { | |
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) | |
... | |
return cell | |
} | |
override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { | |
try! realm.write { | |
let sourceObject = objects[sourceIndexPath.row] | |
let destinationObject = objects[destinationIndexPath.row] | |
let destinationObjectOrder = destinationObject.order | |
if sourceIndexPath.row < destinationIndexPath.row { | |
// 上から下に移動した場合、間の項目を上にシフト | |
for index in sourceIndexPath.row...destinationIndexPath.row { | |
let object = objects[index] | |
object.order -= 1 | |
} | |
} else { | |
// 下から上に移動した場合、間の項目を下にシフト | |
for index in (destinationIndexPath.row..<sourceIndexPath.row).reverse() { | |
let object = objects[index] | |
object.order += 1 | |
} | |
} | |
// 移動したセルの並びを移動先に更新 | |
sourceObject.order = destinationObjectOrder | |
} | |
} | |
override func tableView(tableView: UITableView, shouldIndentWhileEditingRowAtIndexPath indexPath: NSIndexPath) -> Bool { | |
return false | |
} | |
override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { | |
return true | |
} | |
override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle { | |
return .None | |
} | |
} |
And for initialization, I have capsuled a save method to set order, by the way
func save() {
let realm = try! Realm()
realm.beginWrite()
self.order = APRealm().objects(self.classForCoder as! Object.Type).count
realm.add(self)
try! realm.commitWrite()
}
thanks very much
Swift 4.1:
`override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
try! realm?.write {
let sourceObject = items[sourceIndexPath.row]
let destinationObject = items[destinationIndexPath.row]
let destinationObjectOrder = destinationObject.order
if sourceIndexPath.row < destinationIndexPath.row {
for index in sourceIndexPath.row...destinationIndexPath.row {
let object = items[index]
object.order -= 1
}
} else {
for index in (destinationIndexPath.row..<sourceIndexPath.row).reversed() {
let object = items[index]
object.order += 1
}
}
sourceObject.order = destinationObjectOrder
}
}`
Thank you
really helpful
Thank you. Solved a problem in my code.
Thanks Alot!!!
Thank you. Helped a lot
THANK YOU!!
Thank you 🎉
This is genius, thank you!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
finally I found that ,after any deletion, the rows will go to mass, I guess my order init is not correct, how about your order init?