Я пытаюсь составить список по отношению к моему массиву областей. Я не знаю, можно ли взять жестко закодированный массив областей и дать каждой строке свой собственный список. В настоящее время у меня есть свой массив в виде таблицы, и когда строка выбрана, она переходит в свой собственный 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")
}
}
}
Это была опечатка, извините. Это в моем проекте.
Я не понимаю, как использовать область для составления списка из жестко закодированных массивов. Я создал свой массив областей и добавил каждый элемент. Когда я выбираю элемент, он перенаправляет меня к новому контроллеру представления для создания и сохранения данных в его дочерний элемент. Кажется, я не могу заставить это работать. пожалуйста помоги
Это довольно много кода, но я думаю, что основная проблема заключается в начальной структуре dataSource. У вас есть статический объект Почта, источник данных для tableView, и, возможно, в этом проблема. Обычно в качестве источника данных для основного представления таблицы используется массив объектов. При касании строки вы получаете объект по этому индексу, а затем получаете его дочерние свойства для отображения во втором контроллере представления. Это могут быть сведения об объекте или даже другой список. То, что у вас есть, может сработать, но может быть лучше сделать ваш основной источник данных массивом объектов, содержащих дочерние данные.
Привет, спасибо, Джей! Как мне сделать массив объектов?





да. Вы можете создавать многомерные массивы.
Пример:
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 января»)
В моем примере, когда вы выбираете объект «Год», он выйдет как объект JSON, который вы можете легко зациклить. 1. Получите сообщение из области, у которой есть элемент, который вам нужен. 2. используйте простой цикл for для перебора всех дат в этом pos: 'for date in post.dates {... your code ...}' Понятно? или я неправильно понял ваш вопрос?
Возможно, я задал неправильный вопрос, я не уверен, что это будет иметь желаемый эффект, который я ищу. Я пытаюсь создать «linkingObject», когда выбрана строка. Мои post.dates - это просто строки, заполняющие tableView. когда выбрана нужная строка, я хочу, чтобы она создавала связь со ссылкой на область. Очень похоже на приложение со списком дел, которое состоит из категорий и элементов. В этом примере просто есть табличное представление категорий, которое жестко закодировано с заранее определенными категориями. Когда категория выбрана, она должна перейти к списку дочерних элементов.
Точный вариант использования немного неясен, но кажется, что приложение представляет собой конфигурацию 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. Страница сведений следует тому же шаблону, за исключением того, что источником данных являются действия.
Это помогает?
Вы инициализируете объект Home и можете вернуть itemId. Но где строка itemId установлена для домашнего объекта?