Main.storyboard文件中有一个窗口,我正在尝试以编程方式加载,而不是在应用程序启动时加载。所以我已经完全删除了"情节提要入口点",在AppDelegate.swift中,我有:
let storyBoard = NSStoryboard(name: "Main", bundle: nil)
let pauseWindowController = storyBoard.instantiateControllerWithIdentifier("pauseWindowController")
pauseWindowController.showWindow(self)
这似乎有效,但当我运行应用程序时,我没有窗口。我在我的应用程序中添加了跟踪代码来跟踪事件的进展,我发现我的自定义NSView子类已经初始化,但drawRect从未被调用。如果我删除上面的代码并重新添加情节提要入口点(指向窗口控制器),一切都会正常工作。
以下是我为跟踪添加的print
调用的结果,其中显示了调用类和名为的方法
(AppDelegate) applicationDidFinishLaunching
(Pause OverlayWindow : NSWindow) Window init
(PauseOverlayView : NSView) View init
(PauseViewController: NSViewController) viewDidLoad
(PauseViewController: NSViewController) viewDidAppear
(PauseViewController: NSViewController) viewWillDisappear
(PauseViewController: NSViewController) viewDidDisappear
viewDidAppear
之后应该有一行(PauseOverlayView : NSView) drawRect
,并且窗口应该显示,但从未调用该方法。为什么?
我在窗口的情节提要编辑器中选中了"启动时可见"。据我所知,如果视图脏且可见,则会调用drawRect
。我想由于某种原因它不可见,但无法找出原因。
我发现了我的错误:我没有将pauseWindowController
属性(var pauseWindowController : NSWindowController!
)添加到AppDelegate.swift文件的顶部。然后代码应该变成
let storyBoard = NSStoryboard(name: "Main", bundle: nil)
pauseWindowController = storyBoard.instantiateControllerWithIdentifier("pauseWindowController") as! NSWindowController
pauseWindowController.showWindow(self)