Realm Array и дочерние отношения - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь составить список относительно моего массива областей.Я не знаю, можно ли взять массив жестко закодированных областей и дать каждой строке свой список.В настоящее время у меня есть мой массив в табличном представлении, и когда строка выбрана, она переходит к своему собственному 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")
        }
        }
    }

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Точный вариант использования немного неясен, но кажется, что приложение представляет собой конфигурацию 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 = ""
}

записать событие с некоторыми действиями в область

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, поэтому загрузите события вmaster tableView dataSource, который является классом результатов Realm - он ведет себя как массив.

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

, а затем всякий раз, когда приходит время заполнить dataSource:

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 datasource, self.eventResults

let tappedEvent = self.eventResults[tappedRowIndex]

, а затем получить список действий

let activityList = tappedEvent.activities

, который ActivityList может быть передан через segue (или 1000 других способов) в подробный viewController и егостановится источником данных для подробного tableView.Страница сведений следует той же схеме, за исключением того, что источником данных являются действия.

Помогает ли это?

0 голосов
/ 17 декабря 2018

Да.Вы можете создавать многомерные массивы.Пример:1. Объект года имеет список месяцев 2. Объект месяца имеет список дней 3. Объект дня имеет список часов 4. и т. Д., И т. Д.Когда ваше приложение запускается, вы создаете цикл, который инициализирует год, затем инициализирует много месяцев и добавляет их в Year.Month_Array.Делайте то же самое для days_array в каждом месяце.

Чтобы сохранить в Realm, позвоните:

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

Теперь вы можете считывать свой многоуровневый объект Realm в любое время.

Если мой ответ не ясен, пожалуйста, дайте мне знать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...