我有一个核心数据模型,其中有TrainingDiary,其中每天有零个或多个Workouts。我有一个工作的GUI,每个都有一个表格,当我选择一个TrainingDiary它显示适当的天数,然后当我选择一天它显示锻炼时。每个表都有一个Array Controller,它的托管对象上下文绑定到视图控制器中的managedObjectContext var。它们的内容集绑定到Array Controller选择。即 Days Array控制器必须选择Training Diary AC 锻炼阵列控制器必须选择Days AC 然后将表绑定到相关阵列控制器的arrangeObjects。
通过这项工作,我需要更改我的GUI,以便TrainingDiary表位于不同的ViewController中,这样当我选择一个训练日记时,我会更新该选择的各种视图。这是必需的,因为GUI现在变得越来越复杂,我需要解决问题。
我有一个主视图控制器,它有一个显示TrainingDiaries的Table视图。它还有一个Container视图,其中嵌入了Tab View Controller。每个选项卡将显示在表格中选择的TrainingDiary的不同部分。我正在尝试获取第一个选项卡,以显示我在单视图控制器版本中已经工作的日期表。
我无法根据“培训日记表”中的选项更新标签视图。
我试过
模仿它在一个ViewController中的工作方式 - 即将Days AC绑定到Training Diary AC的选择。但是现在他们处于不同的观点,这似乎不是一种选择。
我在培训日记AC选择中添加了一个观察者。我在主视图控制器的viewDidLoad方法中添加了观察者。我在那里实现了observeValue,它将选定的trainingDiary设置为底层视图中的trainingDiary(NB TrainingDiary是来自Core Data实体TrainingDiary的自动生成的类:
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
guard let tabViewController = segue.destinationController
as? NSTabViewController else { return }
for controller in tabViewController.childViewControllers {
if let controller = controller as? DaysViewController {
daysViewController = controller
}
}
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print("observe value called")
daysViewController?.trainingDiary = (trainingDiaryAC.selectedObjects[0] as! TrainingDiary)
}
override func viewDidLoad() {
super.viewDidLoad()
trainingDiaryAC.addObserver(self, forKeyPath: "selectionIndex", options: NSKeyValueObservingOptions.new, context: nil)
}
这感觉是正确的方法,但现在GUI在选择更改时不会更新。即,当训练日记选择被改变时,Days表不会更新。但是,如果我向表中添加一个项目,那么它将全部显示。我尝试在视图控制器NSView上设置needsDisplay为true(甚至尝试循环遍历子视图):
@objc public var trainingDiary: TrainingDiary?{
didSet{
print("Setting Training Diary")
self.view.needsDisplay = true
for v in self.view.subviews{
v.needsDisplay = true
}
}
}
但这也不起作用。通过设置trainingDiary,我似乎已经规避了Core Data附带的所有通知。
所以我的问题
[我正在使用SWIFT 4和XCode 9]