当我以编程方式从情节提要加载窗口时,为啥在 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?