Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 接收窗口通知_Macos_Cocoa - Fatal编程技术网

Macos 接收窗口通知

Macos 接收窗口通知,macos,cocoa,Macos,Cocoa,我在Interface Builder中设置了一个NSWindow。我已将文件所有者的类别设置为myNSWindowController,并将控制器的窗口属性链接到myNSWindow。 我的控制器实现了NSWindowDelegate 现在,在我的控制器中,我添加了以下内容: - (void)windowDidLoad { [super windowDidLoad]; [self.window setDelegate:self]; } - (void)windowDidBe

我在Interface Builder中设置了一个
NSWindow
。我已将
文件所有者的类别设置为my
NSWindowController
,并将控制器的
窗口属性链接到my
NSWindow
。 我的控制器实现了
NSWindowDelegate

现在,在我的控制器中,我添加了以下内容:

- (void)windowDidLoad
{
    [super windowDidLoad];

    [self.window setDelegate:self];
}

- (void)windowDidBecomeMain:(NSNotification *)notification
{
    NSLog(@"Did become main.");
}
不过,
-windowDidBecomeMain:
未被调用。有人知道这是为什么吗

编辑

尝试在启动时从
AppDelegate
显示窗口。主nib(在
Info.plist
中声明)仅包含链接到
AppDelegate
的菜单项。在applicationdelegate中,我在状态栏上显示一个图标,单击该图标时,我将显示主nib中的菜单。 在applicationdelegate中,我还想显示一个窗口,该窗口应该分配一个窗口控制器来处理逻辑。 我相信,当这项工作,我会收到我的窗口通知

现在,下面的代码没有显示窗口,我不知道为什么

DemoWindowController *dwc = [[DemoWindowController alloc] initWithWindowNibName:@"DemoWindowController"];
[dwc showWindow:self];

请注意,
self
是应用程序委托。

我怀疑您的问题是因为您的窗口控制器实际上不是nibs文件所有者的对象

当您在interface builder中更改类时,您会告诉它哪些出口和操作可用(这就是为什么您可以拖动到窗口出口),但您自己仍负责传递此对象

对于非基于文档的应用程序,您将有一个调用
NSApplicationMain
的main方法。这主要是查找并加载info.plist文件中指定的窗口nib,并将当前的
NSApplication
实例作为文件所有者传递给该nib(因此,即使将类类型更改为
NSWindowController
,传递的对象实际上是NSApplication类型)

解决问题的最简单方法是暂时摆脱窗口控制器(因为它实际上还没有做任何事情)

您应该在应用程序委托中实现
-windowDidBecomeMain:
方法。然后按住Ctrl键并将其从窗口拖动到appDelegate,将其设置为窗口的代理以获取通知

更新

要回答有关
WindowController
的问题,请注意以下两个问题:

  • 您正在
    ApplicationIDFinishLaunching:
    方法中创建窗口控制器变量(dwc)。当您离开该方法并带着它打开窗口时,它就会被释放。创建一个实例变量以保留窗口控制器
  • 确保第二个窗口nib的文件所有者设置为NSWindowController(或窗口控制器类型),并且其窗口出口连接到nib文件中的窗口

  • 您的窗口现在应该显示。

    您的窗口控制器实际上是打开窗口的对象吗?如果不是,那么你的文件所有者将无法正确设置。我对Mac OS开发非常陌生,但已经做了几年的iOS开发。老实说,我很难弄清楚窗口控制器的角色和应用程序委托的角色。对于iOS和Mac OS来说,情况似乎不一样。我从
    AppDelegate
    实例化窗口控制器。这就是我没有收到通知的原因,你能告诉我应该做些什么吗?你的应用程序是否是基于文档的应用程序?不,不是。我根本不使用
    NSDocument
    课程。我认为你引导我走上了正确的道路。我想从我的
    AppDelegate
    中显示一个窗口,以便在启动时显示此窗口。我的主nib(在
    Info.plist
    中声明)仅包含一个菜单项。我已经创建了一个新的nib文件,希望添加一个窗口控制器来处理这个窗口的逻辑。在我的'AppDelegate'中,我试图显示一个新窗口(请参见我的原始问题),但该窗口没有显示。你知道为什么会这样吗?我相信当窗口显示时,它将分配我的窗口控制器,并且我将收到窗口通知。您是否告诉您的
    WindowController
    要加载哪个nib文件?通常的方法是调用
    –initWithWindowNibName:
    传入nib文件的名称。是的,我确实传入了nib的名称。在我最初的问题中,我演示了如何初始化窗口控制器以及如何尝试显示窗口。在
    -applicationdFinishLaunching:
    尝试调用
    [YourWindowController window]