如何使用 NSViewController 识别 modalForWindow

Posted

技术标签:

【中文标题】如何使用 NSViewController 识别 modalForWindow【英文标题】:Howto identify modalForWindow using NSViewController 【发布时间】:2012-10-09 01:24:35 【问题描述】:

我的 OSX NSApplicationDelegate 有一个 NSWindow(主窗口)。 NSWindow 还包含几个 NSView,其中内容是使用 NSViewControllers 设置的。目前,当我想要一个 NSPanel(一张工作表)从我的一个 NSView 的顶部(而不是从我的应用程序的顶部)下拉时,我遇到了一个问题。我想使用代码:

[NSApp beginSheet:self.loginSheet.window
       modalForWindow:self.view.window
        modalDelegate:self
       didEndSelector:nil
          contextInfo:nil];

loginSheet 是 NSWindowController 的子类,它使用以下方式加载 xib 文件:

 loginSheet = [[sheetWindowController alloc] initWithWindowNibName:@"loginSheet"];

但是,我从 NSViewController 运行此代码,而我的 self.view.window 始终为零。我的 NSView 似乎已正确初始化并且工作正常,但是由于我的 modalForwindow (self.view.window) 为 nil,因此工作表的下拉菜单不起作用。如果我使用代码:

 [NSApp beginSheet:self.loginSheet.window
       modalForWindow:[[NSApplication sharedApplication] mainWindow]
        modalDelegate:self
       didEndSelector:nil
          contextInfo:nil];

它就像一个魅力。但是从我所有寻找问题答案的搜索来看,这种工作方法似乎是一个很大的禁忌,因为它阻止了整个应用程序的任何响应。我希望我的工作表链接到我的 NSView 之一,但鉴于该应用程序只有一个 NSWindow,我不知道如何做到这一点?我没有做一些让我的 self.view.window 保持为零的事情吗?有什么好方法可以让我找到自定义视图的父窗口吗?如果您对如何解决此问题有任何建议,或者可以提示我做错了什么,将不胜感激。

谢谢!干杯,特隆德

【问题讨论】:

【参考方案1】:

您应该查看“表格简介”文档的“定位表格”部分。它解释了如何使用 window:willPositionSheet:usingRect:

使工作表从窗口标题栏下方以外的地方出现

【讨论】:

感谢您为我指明正确的方向!我让它工作得很好,但我必须使用 [[NSApplication sharedApplication] mainWindow] 来识别我的窗口。

以上是关于如何使用 NSViewController 识别 modalForWindow的主要内容,如果未能解决你的问题,请参考以下文章

如何在基于 NSDocument 的 Cocoa 应用程序中使用 NSViewController

如何从 NSViewController 显示视图?

如何在 Mac OS X 应用程序中从一个 NSViewcontroller 推送到另一个 NSViewcontroller?

如何在 NSViewController 中重新加载数据?

如何在 NSApplicationDelegate 上加载 NSViewController

从 NSTableView 获取数据到 NSViewController