Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save kishikawakatsumi/cc4a1f32fb8ee34eb509d54027d731b5 to your computer and use it in GitHub Desktop.
Save kishikawakatsumi/cc4a1f32fb8ee34eb509d54027d731b5 to your computer and use it in GitHub Desktop.
Reorder Realm Results in UITableView
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
}
}
@Heki2017
Copy link

Heki2017 commented Mar 2, 2018

thanks very much

@rodydavis
Copy link

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
    }
}`

@Ksen17
Copy link

Ksen17 commented Dec 28, 2018

Thank you
really helpful

@StuffbyYuki
Copy link

Thank you. Solved a problem in my code.

@jimmychung28
Copy link

Thanks Alot!!!

@MattMash
Copy link

Thank you. Helped a lot

@1KEBRON
Copy link

1KEBRON commented Nov 17, 2019

THANK YOU!!

@sunshineLixun
Copy link

Thank you 🎉

@genefever
Copy link

This is genius, thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment