如何从App Delegate访问View Controller(XCode 9)

时间:2017-09-29 11:55:02

标签: ios swift xcode9

我有一个带有拆分视图的故事板。当应用程序启动时,我想为视图设置模型。

我有一个简单的课日:

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实例,以便设置此值?

3 个答案:

答案 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中几乎没有任何东西。相反,我做了以下事情:

  1. 我有协议,所有视图控制器都提供模型实现的视图

    protocol TrainingDiaryViewController{
        func set(trainingDiary td: TrainingDiary)
    }
    
  2. 我的主窗口的视图控制器现在有一个TabViewController(而不是我的拆分视图,但这种方法适用于此)。

  3. 在该视图控制器中,我覆盖了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上观看的视图控制器

  4. 在主视图中有一个TableView,我用它来管理训练日记(即添加,删除,选择)。主视图控制器设置为TableViews委托,TableView在IB中设置为单选,避免选择。然后我实施了:

    func tableViewSelectionDidChange(_ notification: Notification) {
        if let trainingDiary = trainingDiarysArrayController.selectedObjects[0] as? TrainingDiary{
    
            for c in trainingDiaryVCs{
                c.set(trainingDiary: trainingDiary)
            }
        }
    }
    
  5. 一切都很棒。