簡體   English   中英

如何從 App Delegate (XCode 9) 訪問視圖控制器

[英]How to I access View Controllers from App Delegate (XCode 9)

我有一個帶有拆分視圖的故事板。 當應用程序啟動時,我想為視圖設置模型。

我有一個簡單的課堂日:

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
  //  }   
}

我想在應用程序委托中設置日期,以便它顯示它。

如何在 AppDelegate 中獲取 DayViewController 的實例,以便設置此值?

你試過這個嗎?

    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 本身。

這就是我最終要做的。 認為它可能會引起興趣。 仍然不確定這是否是黑客攻擊。

在 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)
}

根據評論中的要求,這就是我現在所做的,我有更多的 swift 經驗。

該示例使用一個簡單的“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) } } }

一切都很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM