我有一个带有拆分视图的故事板。当应用程序启动时,我想为视图设置模型。
我有一个简单的课日:
import Foundation
class Day: NSObject{
var date: Date
var sleep: Double
init(date: Date, sleep: Double){
self.date = date
self.sleep = sleep
super.init()
}
override convenience init(){
self.init(date: Date(), sleep: 8.0)
}
}
我有一个分割窗格的视图控制器:
import Cocoa
class DayViewController: NSViewController {
private var day: Day = Day()
@IBOutlet weak var sleep: NSTextField!
func set(day: Day){
self.day = day
//update()
}
// func update(){
//sleep.doubleValue = day.sleep
// }
}
我想在app委托中设置Day,以便显示它。
如何在AppDelegate中获取DayViewController实例,以便设置此值?
答案 0 :(得分:1)
你试过这个吗?
if window?.rootViewController is DayViewController {
guard let dayVC = window?.rootViewController as? DayViewController else {
//there was an error
return
dayVC.set(day: new Day())
}
我不确定它是否有用。也许最好按照@Siyavash的说法......放入viewDidLoad本身。
答案 1 :(得分:0)
这就是我最终要做的事情。认为它可能是有趣的。尚未确定这是否是一个黑客攻击。
在DayViewController中,我在AppDelegate中设置了对它的引用:
override func viewDidLoad() {
super.viewDidLoad()
let app: AppDelegate = NSApplication.shared.delegate as! AppDelegate
app.dayViewController = self
}
在AppDelegate中,我可以设置视图的日期:
var dayViewController: DayViewController?
func applicationDidFinishLaunching(_ aNotification: Notification) {
let day: Day = Day.init(date: Date(), sleep: 9.5)
dayViewController!.set(day: day)
}
答案 2 :(得分:0)
根据评论中的要求,这是我现在所做的,我有更多的快速经验。
该示例使用简单的“Day”类作为我的模型,但在我的实现中,该模型称为“TrainingDiary”。我现在在AppDelegate中几乎没有任何东西。相反,我做了以下事情:
我有协议,所有视图控制器都提供模型实现的视图
protocol TrainingDiaryViewController{
func set(trainingDiary td: TrainingDiary)
}
我的主窗口的视图控制器现在有一个TabViewController(而不是我的拆分视图,但这种方法适用于此)。
在该视图控制器中,我覆盖了prepare(for:sender :):
override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
guard let tabViewController = segue.destinationController as? NSTabViewController else {return}
for controller in tabViewController.childViewControllers{
if let c = controller as? TrainingDiaryViewController{
trainingDiaryVCs.append(c)
}
}
}
这意味着我现在可以参考所有在TrainingDiary上观看的视图控制器
在主视图中有一个TableView,我用它来管理训练日记(即添加,删除,选择)。主视图控制器设置为TableViews委托,TableView在IB中设置为单选,避免选择。然后我实施了:
func tableViewSelectionDidChange(_ notification: Notification) {
if let trainingDiary = trainingDiarysArrayController.selectedObjects[0] as? TrainingDiary{
for c in trainingDiaryVCs{
c.set(trainingDiary: trainingDiary)
}
}
}
一切都很棒。