如何在Realm Swift中重新排序UITableView单元?

时间:2016-10-18 05:49:39

标签: ios swift uitableview realm

我使用 Realm 作为我的Note-taking-app。 我之前使用过核心数据,现在我正在将核心数据迁移到领域,但是我遇到了麻烦!重新排序这样的对象会导致错误。

do {  
let realm = try Realm()
let source = myNote[sour!.row]        
try realm.write() {
 myNote.remove(objectAtIndex: sourceIndexPath!.row)
 myNote.insert(source, at: destensionIndexPath!.row)
 }
 }
 catch {
 print("handle error")
 }

所以我补充道 orderPosition 属性到我的对象

dynamic var orderPosition: Int = 0

并将 tableView moveRowAtIndexPath 更改为此  ReorderingRealmResultsInTableView.swift

但它没有多大帮助。 那么我如何在领域中重新排序对象

3 个答案:

答案 0 :(得分:4)

我建议您将订购的商品存储在List中,而不是根据orderPosition属性进行排序。

在移动项目时手动存储索引的性能要差得多,因为“旧索引”和“新索引”之间的所有对象都需要进行变异以考虑更改。

然后,您可以使用List.move(from:to:)将对象从一个索引移动到另一个索引,这应该直接对应于您正在重新排序的表视图中的索引。

以下是您可以遵循的教程,指导您构建任务管理应用程序,包括对重新排序任务的支持:https://realm.io/docs/realm-mobile-platform/example-app/cocoa/

答案 1 :(得分:0)

orderPosition: Double肯定是高效和干净的,但我不确定如何通过服务器同步它。所以在我的情况下,我使用的是orderPosition,并且该值被计算为插入对象的两个现有try! list.realm?.commitWrite(withoutNotifying: [notificationToken!])的中间位置。另请注意,您可以在不通知通知的情况下执行写入:data my_data; input study $ year rr lcl ucl; datalines; mickey 2015 1.5 0.7 2.3 minny 2010 1.2 1.0 1.4 donald 2013 0.8 0.2 1.4 daisy 2014 1.3 1.0 1.6 goofy 2017 1.9 0.9 2.9 pluto 2010 1.4 0.7 2.1 ; run; proc sgplot data=my_data noautolegend nocycleattrs; scatter y=study x=rr/ markerattrs=(symbol=squarefilled size=12 color=black); highlow high=ucl low=lcl y=study / type=line lineattrs=(color=black); yaxistable study year / labelattrs=(family=arial size=12pt weight=bold) position=left location=inside valueattrs=(family=arial size=10pt); yaxistable rr lcl ucl / labelattrs=(family=arial size=12pt weight=bold) position=right location=inside valueattrs=(family=arial size=10pt); xaxis offsetmin=0.1 offsetmax=1 min=0.5 max=3.0 display=(nolabel); yaxis offsetmin=0.1 offsetmax=0.1 display=none reverse; refline 1 / axis=x; styleattrs axisextent=data; run;

答案 2 :(得分:0)

正如其他人所建议的那样,列表是解决方案。这是在Swift 5上实现该方法的示例:

import UIKit
import RealmSwift

// The master list of `Item`s stored in realm
class Items: Object {
    @objc dynamic var id: Int = 0
    let items = List<Item>()

    override static func primaryKey() -> String? {
        return "id"
    }
}

class Item: Object {
    @objc dynamic var id: String = UUID().uuidString
    @objc dynamic var name = ""
}

class ViewController: UITableViewController {
    let realm = try! Realm()
    var items = RealmSwift.List<Item>()

    override func viewDidLoad() {
        super.viewDidLoad()

        // initialize database
        var itemsData = realm.object(ofType: Items.self, forPrimaryKey: 0)
        if itemsData == nil {
            itemsData = try! realm.write { realm.create(Items.self, value: []) }
        }
        items = itemsData!.items

        // temporarily add new items
        let newItem1 = Item()
        newItem1.name = "Item 1"
        let newItem2 = Item()
        newItem2.name = "Item 2"
        try! realm.write {
            items.append(newItem1)
            items.append(newItem2)
        }
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    ...

    func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        try! items.realm?.write {
            items.move(from: sourceIndexPath.row, to: destinationIndexPath.row)
        }
    }
}

您可以在examples/下的GitHub Repo(https://github.com/realm/realm-cocoa)中找到适用于iOS和macOS的示例应用程序,说明如何使用Realm的许多功能,例如迁移,如何与UITableViewControllers一起使用,加密,命令行工具等等。