【问题标题】:Realm Array and child relationships领域数组和子关系
【发布时间】:2018-12-17 13:33:08
【问题描述】:

我正在尝试创建一个与我的领域数组相关的列表。我不知道是否可以采用硬编码领域数组并为每个字符串提供自己的列表。目前我在表视图中拥有我的数组,并且当将行选择一行以自己的ViewController时。我试图让每个选定的行包含自己的列表。这是代码

数据模型 1

import Foundation
import RealmSwift

class DateChange: Object {

    @objc dynamic var itemId : String = UUID().uuidString

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

    let dates = List<String>()
    let selection = List<Home>()

    convenience init(tag: String) {
        self.init()
    }
}

数据模型 2

class Home: Object {

  @objc dynamic var itemId : String = UUID().uuidString

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

    var parentCategory = LinkingObjects(fromType: Home.self, property: "selection")

视图控制器 1

class WeekOfViewController: NSViewController {

let post = DateChange(tag: "")

        post.dates.append("December 30th - January 5th")
        post.dates.append("January 13th - January 19th")

}

    func numberOfRows(in tableView: NSTableView) -> Int {
        return 2

    }

    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        let cell =  tableView.makeView(withIdentifier:
            NSUserInterfaceItemIdentifier(rawValue: "dateCell") , owner: self) as! NSTableCellView?
        cell?.textField?.stringValue = post.dates[row]
        return cell
    }

    func tableViewSelectionDidChange(_ notification: Notification) {
        self.performSegue(withIdentifier: "selectedDate", sender: self)

    }


    override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
        // Unwrap the segue's identifier.

        guard let identifier = segue.identifier else { return }
        // Make sure this is the segue we care about.

        if identifier == "selectedDate" {
            let secondVC = segue.destinationController as! ViewController2

            // Figure out which row was selected.
            if let selectedRow =  dateTableView?.selectedRow {
                secondVC.selectedDate = post.dates[selectedRow]

            }

视图控制器 2

class ViewController2: NSViewController {

 @IBAction func saveData(_ sender: NSButton) {
        if let appendDate = selectedDate {
            do {
                 try realm?.write {
        let homeData = Home()
 homeData.done = false
        appendDate.dates.append()
            }
        } catch {
            print("There was an error saving")
        }
        }
    }

【问题讨论】:

  • 你初始化'Home'对象,你可以返回“itemId”。但是为 Home 对象设置的字符串“itemId”在哪里?
  • 这是一个错字对不起。它在我的项目中。
  • 我不明白如何使用领域从硬编码数组中创建一个列表。我制作了我的领域数组,并附加了每个项目。当我选择一个项目时,它会将我转到一个新的视图控制器以创建数据并将其保存到它的子元素。我似乎无法完成这项工作。请帮忙
  • 那是相当多的代码,但我认为核心问题是初始数据源结构。你有一个静态 post 对象,tableView 的数据源,也许这就是问题所在。通常你会有一个对象数组作为主表视图的数据源。当您点击一行时,您会在该索引处获取对象,然后将其子属性显示在第二个视图控制器中。这可能是关于对象的详细信息,甚至是另一个列表。你所拥有的可能有点工作,但最好让你的主数据源成为一个包含子数据的对象数组。
  • 嘿,谢谢 Jay,我将如何制作一组对象?

标签: swift macos cocoa realm


【解决方案1】:

是的。您可以制作多维数组。
示例:
1. Year 对象有月份列表 2. Month 对象有天的列表 3. Day 对象有一个小时列表 4.等等等等

当您启动应用程序时,您会创建一个循环来初始化年份,然后初始化许多月份并将它们附加到 Year.Month_Array 中。每个月对 days_array 执行相同的操作。

要保存在 Realm 中,请调用:

try! realm.write {
    realm.add(Year)
}

现在您可以随时读出您的多级 Realm 对象。

如果我的答案不清楚,请告诉我

【讨论】:

  • 是的,如果你能澄清我如何将我的 dataModel 中的 'itemId' 循环到这个数组 - 让 post = DateChange(tag: "") post.dates.append("December 30th - January 5th ") post.dates.append("1 月 13 日 - 1 月 19 日")
  • 如果我的示例是,当您获取“Year”对象时,它将以 JSON 对象的形式出现,您可以轻松循环。 1. 从领域中获取具有您想要的 itemId 的帖子。 2. 使用一个简单的 for 循环遍历该 pos 中的所有日期:'for date in post.dates { ... your code ...}' 这清楚吗?还是我没有正确理解您的问题?
  • 也许我问错了问题,我不确定这是否会产生我正在寻找的欲望效果。我尝试在选择行时创建“链接对象”。我的 post.dates 只是填充 tableView 的字符串。选择所需行时,我希望它创建与Realm链接的关系。很像一个由类别和项目组成的待办事项列表应用程序。这个例子只是有一个类别表视图,它用预先确定的类别进行硬编码。当一个类别被选中时,它应该继续到它的子项目列表。
【解决方案2】:

确切的用例有点不清楚,但似乎该应用程序是 Master->Detail 配置,其中主页包含日期列表,然后当点击日期时,它会转到包含更多信息的详细信息页面.

这是处理对象的代码示例。你知道如何使用它的委托方法填充 tableView,所以我省略了这部分。

假设我们想要母版页上的事件列表,然后是详细信息页上每个事件的活动。从两个托管的 Realm 对象开始;具有开始和结束日期、事件标题和该事件中的活动列表的事件对象。然后是活动对象。

class EventClass: Object {
    @objc dynamic var start_date: Date?
    @objc dynamic var end_date: Date?
    @objc dynamic var event_title = ""
    let activities = List<ActivityClass>()
}

class ActivityClass: Object {
    @objc dynamic var title = ""
}

将包含一些活动的事件写入 Realm

let formatter = DateFormatter()
formatter.dateFormat = "yyyymmdd"

let e0 = EventClass()
e0.event_title = "Workshop"
e0.start_date = formatter.date(from: "20180113")
e0.end_date = formatter.date(from: "20180119")

let a0e0 = ActivityClass()
a0e0.title = "Some activity"
let a0e1 = ActivityClass()
a0e1.title = "Another activity"
let a0e2 = ActivityClass()
a0e2.title = "Activity continues"

e0.activities.append(a0e0)
e0.activities.append(a0e1)
e0.activities.append(a0e2)

// write event 0 (e0) to realm which will create the event and activities

我们假设主视图和细节视图都有 tableViews,所以将事件加载到主 tableView 数据源中,这是一个 Realm 结果类 - 它的行为就像一个数组。

class ViewController: NSViewController {
    var eventResults: Results<EventClass>? = nil

然后每当需要填充数据源时:

self.eventResults = realm.objects(EventClass.self)

然后 tableView 委托方法可以获取每一行进行显示。它在母版页上看起来像这样

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
        let cell =  tableView.makeView(withIdentifier:
            NSUserInterfaceItemIdentifier(rawValue: "dateCell") , owner: self) as! NSTableCellView?
        //cell?.textField?.stringValue = post.dates[row]
        let event = self.eventResults[row]
        cell.textField?.stringValue = "Event: \(title) from: \(start) - \(end)"
        return cell
    }

所以 tableView 看起来像这样

Event: Workshop from: 2018-12-30 - 2018-01-05
Event: Workshop from: 2018-01-13 - 2018-01-19
etc

当点击一行时,从主 tableView 数据源 self.eventResults 中获取该事件对象

let tappedEvent = self.eventResults[tappedRowIndex]

然后获取活动列表

let activityList = tappedEvent.activities

activityList 可以通过 segue(或 1000 种其他方式)传递给详细视图控制器,它成为详细表视图的数据源。详细信息页面遵循相同的模式,只是 dataSource 是活动。

这有帮助吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2014-03-17
    • 2019-05-09
    相关资源
    最近更新 更多