【问题标题】:How do I sort in numerical order, the items in a to-many relationship?如何按数字顺序对一对多关系中的项目进行排序?
【发布时间】:2020-07-18 10:33:11
【问题描述】:

我有 2 个模型(一个“类别”模型和一个“项目”模型),如下所示。 “类别”通过属性“项目”与“项目”具有一对多关系

我想按“顺序”获取“类别”和“项目”的排序数据,但我该怎么做呢?

  • Category.swift

    import Foundation
    import RealmSwift
    
    class Category: Object {
        @objc dynamic var name: String = ""
        @objc dynamic var order: Int = 0  // use this for sorting
        let items = List<Item>
    }
    
  • Item.swift

    import Foundation
    import RealmSwift
    
    class Item: Object {
        @objc dynamic var name: String = ""
        @objc dynamic var order: Int = 0  // use this for sotging
        let category = LinkingObjects(fromType: Category.self, property: "items")   
    }
    

我只能按“类别”的顺序对“类别”进行排序,但不能对“项目”进行排序

let categories = realm.objects(Category.self).sorted(byKeyPath: "order", ascending: true)

【问题讨论】:

  • 这个问题有点不清楚。 Category 对象有一个items 列表 - 您将如何按另一个列表对类别进行排序。假设类别 A 有一个包含 D 和 F 的列表。类别 B 有一个包含 C 和 Z 的列表。这种排序将如何工作? C 在 D 之前,但 F 在 Z 之前。您能否阐明您要做什么,或者甚至可以在问题中包含一个示例,说明您正在寻找什么结果?
  • 我在帖子中添加了一张照片,以更好地解释我想要完成的任务。我正在制作一个购物清单应用程序。首先我有一个类别。类别是蔬菜、肉类、水果等。然后对于每个类别名称,都有一个为其顺序分配的编号。对于每个类别名称,都有一个特定的列表。例如,在蔬菜类别中,有一个不同蔬菜的商品列表,如胡萝卜、茄子等。对于每个商品,都有一个对应的订单编号。例如,胡萝卜是 1,茄子是 2,土豆是 3,依此类推。
  • 我想要完成的是能够按正确的数字顺序显示类别和项目。例如:对于类别……如果蔬菜是 2,水果是 3,肉类是 1,我希望它像这样显示……。肉 1 蔬菜 2 水果 3 我也想对每个类别的项目做同样的事情 例如:茄子是 2,马铃薯是 3,胡萝卜是 1 我希望它像这样显示……胡萝卜 1 茄子 2 土豆 3 我是能够为“类别”做,但我不能为项目列表做。
  • 我查看了您的屏幕截图,但仍不清楚您希望对您的商品进行什么样的订购。我看到洋葱和番茄是排在前面的,但为什么它们排在橙子和苹果之前?换句话说,如果肉类是第一个类别,那么为什么鸡肉和猪肉没有列在项目列表的首位?这可以追溯到我在第一条评论中提出的问题 - 订购商品的目的是什么以及您如何确定该订单是什么?例如先吃肉,再吃蔬菜,再吃水果?还是别的什么?
  • 对不起,我之前发的图有误,现在换成固定的。我只是希望它们在表格视图中按数字顺序列出。

标签: ios swift sorting realm relationship


【解决方案1】:

你真的不远了。

Realm Results 对象可以是无序的,因此制定策略以保持 Results 对象按您想要的顺序加载非常重要。照原样,你已经在你的类别对象上得到了这个

@objc dynamic var order: Int = 0  // use this for sorting

另一方面,Realm List 对象保持插入顺序

class Category: Object {
    let items = List<Item>

因此,如果将鸡肉添加到类别项目列表中,然后是猪肉,则该顺序将保持不变;索引为 0 的鸡肉,索引为 1 的猪肉。

Meat
   chicken
   pork

Realm Documentation 对此进行了介绍

保证列表属性保持其插入顺序。

因此,在填充问题中的 tableView 时,您可以使用 tableView titleForHeaderInSection 从结果对象中获取部分名称(类别:肉类、蔬菜、水果)(因为它们是在加载结果时排序的来自领域)

然后对于每个部分中的行,您可以阅读项目的 Category->items List,因为它们在 List 中,因此将按它们的插入排序。

为了完整起见,这里是处理 tableView 部分的代码

//
//handle sections
//
func numberOfSections(in tableView: UITableView) -> Int {
    return self.yourCategoryResults.count
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    let title = self.yourCategoryResults[section].name //the section title
    return title
}

然后是处理每个部分中的行的代码

//
//handleTableView rows
//
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let rowsInSection = self.yourCategoryResults[section].items.count
    return rowsInSection
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellReuseIdentifier", for: indexPath)
    let item = self.yourCategoryResults[indexPath.section].items[indexPath.row]
    let text = item.name
    cell.textLabel?.text = text
    return cell
}

【讨论】:

  • 感谢您的回答!因为你给我的信息,我可以解决我的问题。再次感谢!
  • @naoya 太棒了!如果它有帮助,请务必接受它,以便它可以帮助其他人。 How To Accept
猜你喜欢
  • 2022-01-13
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
相关资源
最近更新 更多