当我以编程方式从情节提要加载窗口时,为啥在 NSView 中未调用 drawRect?

Posted

技术标签:

【中文标题】当我以编程方式从情节提要加载窗口时,为啥在 NSView 中未调用 drawRect?【英文标题】:Why is drawRect not called in the NSView when I programmatically load my window from a storyboard?当我以编程方式从情节提要加载窗口时,为什么在 NSView 中未调用 drawRect? 【发布时间】:2015-11-08 20:50:36 【问题描述】:

我的 Main.storyboard 文件中有一个窗口,我试图以编程方式加载,而不是在应用程序启动时加载。所以我已经完全删除了“故事板入口点”,在 AppDelegate.swift 中,我有:

let storyBoard = NSStoryboard(name: "Main", bundle: nil)
let pauseWindowController = storyBoard.instantiateControllerWithIdentifier("pauseWindowController")
pauseWindowController.showWindow(self)

这似乎可行,但是当我运行该应用程序时,我没有得到任何窗口。我在我的应用程序中添加了跟踪代码以跟踪事件的进展,我发现我的自定义 NSView 子类已初始化,但 drawRect 从未被调用。如果我删除上面的代码并重新添加 Storyboard 入口点(指向窗口控制器),一切正常。

这是我为跟踪添加的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。我想它由于某种原因不可见,但无法找出原因。

【问题讨论】:

【参考方案1】:

我发现了我的错误:我没有将 pauseWindowController 属性 (var pauseWindowController : NSWindowController!) 添加到我的 AppDelegate.swift 文件的顶部。然后代码应该变成

let storyBoard = NSStoryboard(name: "Main", bundle: nil)
pauseWindowController = storyBoard.instantiateControllerWithIdentifier("pauseWindowController") as! NSWindowController
pauseWindowController.showWindow(self)

【讨论】:

以上是关于当我以编程方式从情节提要加载窗口时,为啥在 NSView 中未调用 drawRect?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试从情节提要中转接时,为啥在这行代码中出现段错误?

如何从情节提要以编程方式加载 UIViewController?

为啥我没有成功以编程方式使用 segue?

如何以编程方式从情节提要中填充静态 UITableView?

快速以编程方式创建后如何在情节提要中链接 UIButton

以编程方式添加的视图对象未显示在情节提要中