Массив сфер и дочерние отношения

Я пытаюсь составить список по отношению к моему массиву областей. Я не знаю, можно ли взять жестко закодированный массив областей и дать каждой строке свой собственный список. В настоящее время у меня есть свой массив в виде таблицы, и когда строка выбрана, она переходит в свой собственный 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. Но где строка itemId установлена ​​для домашнего объекта?

smoothBlue 17.12.2018 15:48

Это была опечатка, извините. Это в моем проекте.

Cartisim 17.12.2018 15:55

Я не понимаю, как использовать область для составления списка из жестко закодированных массивов. Я создал свой массив областей и добавил каждый элемент. Когда я выбираю элемент, он перенаправляет меня к новому контроллеру представления для создания и сохранения данных в его дочерний элемент. Кажется, я не могу заставить это работать. пожалуйста помоги

Cartisim 17.12.2018 23:06

Это довольно много кода, но я думаю, что основная проблема заключается в начальной структуре dataSource. У вас есть статический объект Почта, источник данных для tableView, и, возможно, в этом проблема. Обычно в качестве источника данных для основного представления таблицы используется массив объектов. При касании строки вы получаете объект по этому индексу, а затем получаете его дочерние свойства для отображения во втором контроллере представления. Это могут быть сведения об объекте или даже другой список. То, что у вас есть, может сработать, но может быть лучше сделать ваш основной источник данных массивом объектов, содержащих дочерние данные.

Jay 18.12.2018 20:39

Привет, спасибо, Джей! Как мне сделать массив объектов?

Cartisim 18.12.2018 20:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
150
2

Ответы 2

да. Вы можете создавать многомерные массивы. Пример:
1. Объект "Год" содержит список месяцев. 2. Объект "Месяц" содержит список дней. 3. У объекта "День" есть список часов. 4. и т. д. И т. Д.

Когда вы запускаете приложение, вы создаете цикл, который инициализирует год, затем инициализирует множество месяцев и добавляет их в Year.Month_Array. Делайте то же самое для days_array каждый месяц.

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

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

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

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

да, пожалуйста, не могли бы вы прояснить, как я мог бы зациклить 'itemId' в моей модели dataModel на этот массив - let post = DateChange (tag: "") post.dates.append ("30 декабря - 5 января") post.dates.append ( «13 января - 19 января»)

Cartisim 17.12.2018 16:50

В моем примере, когда вы выбираете объект «Год», он выйдет как объект JSON, который вы можете легко зациклить. 1. Получите сообщение из области, у которой есть элемент, который вам нужен. 2. используйте простой цикл for для перебора всех дат в этом pos: 'for date in post.dates {... your code ...}' Понятно? или я неправильно понял ваш вопрос?

smoothBlue 18.12.2018 03:54

Возможно, я задал неправильный вопрос, я не уверен, что это будет иметь желаемый эффект, который я ищу. Я пытаюсь создать «linkingObject», когда выбрана строка. Мои post.dates - это просто строки, заполняющие tableView. когда выбрана нужная строка, я хочу, чтобы она создавала связь со ссылкой на область. Очень похоже на приложение со списком дел, которое состоит из категорий и элементов. В этом примере просто есть табличное представление категорий, которое жестко закодировано с заранее определенными категориями. Когда категория выбрана, она должна перейти к списку дочерних элементов.

Cartisim 18.12.2018 04:05

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

Мы предполагаем, что как главное, так и подробное представления имеют tableView, поэтому загружайте события в основной источник данных 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

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

Это помогает?

Другие вопросы по теме