为什么当我以编程方式从情节提要加载窗口时,NSView中没有调用drawRect



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)

最新更新