![](/img/trans.png)
[英]How to access multiple View Controllers from App Delegate and/or other View Controllers?
[英]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 中幾乎沒有任何內容。 相反,我做了以下事情:
我有所有提供模型視圖的視圖控制器實現的協議
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) } } }
一切都很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.