Cocoa:从另一个窗口创建并关闭一个窗口

Posted

技术标签:

【中文标题】Cocoa:从另一个窗口创建并关闭一个窗口【英文标题】:Cocoa: Create, and close, one window from another 【发布时间】:2011-11-17 22:18:16 【问题描述】:

我正在寻找一个最简单的例子,它显示一个窗口打开另一个窗口然后关闭它。

我似乎被卡住的地方是NIB以及插座的接线方式。我可以轻松创建窗口;关闭它是一个挑战。

非常感谢任何建议!

我在下面附上我的代码。我认为我想做的很简单,但它不起作用。感谢 Francis,我现在可以打开和关闭窗口,但是一旦我尝试再次打开它,应用程序就会崩溃 (EXC_BAD_ACCESS)。我确信这是由于我对 NIB 与类的关系理解不足。在大多数语言中,我只需要实例化一个窗口的新实例,然后将其关闭。

我在MainMenu.xib 中有 2 个窗口。 (我更愿意将窗口放在单独的 NIB 中,但这似乎会产生其他问题!)AppDelegate 有 2 个出口,分别是 window(原始)和 otherWindow(创建的第二个窗口)。

第一个窗口有 2 个按钮:“打开窗口”和“关闭窗口”,连接到代码中的 2 个方法。

代码:

MyTestAppDelegate.h

#import <Cocoa/Cocoa.h>

@interface MyTestAppDelegate : NSObject <NSApplicationDelegate> 
    NSWindow *window;
    NSWindow *otherWindow;


@property (assign) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSWindow *otherWindow;

- (IBAction)openOtherWindow:(id)sender;
- (IBAction)closeOtherWindow:(id)sender;

@end

MyTestAppDelegate.c

#import "MyTestAppDelegate.h"

@implementation MyTestAppDelegate

@synthesize window;
@synthesize otherWindow;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification

    // Insert code here to initialize your application


- (IBAction)openOtherWindow:(id)sender

    [otherWindow makeKeyAndOrderFront:sender];


- (IBAction)closeOtherWindow:(id)sender

    [otherWindow close];

@end

【问题讨论】:

非常重要的细节:这是针对 Mac 应用程序,而不是 ios 应用程序。 【参考方案1】:

基本上,在您的 NIB 中,您可以创建各种窗口、添加按钮、文本字段等。然后您添加一个自定义对象,该对象充当“控制器”,向窗口和各种控件发送和接收消息。在一个简单的项目中,您可以使用自动创建的 AppDelegate 对象来控制您的窗口,对于较大的项目,您需要一个单独的对象来处理逻辑,它可以是 NSObject 或 NSWindowController 的实例,具体取决于您的需要。

Windows 可以设置为“在启动时可见”,这会在您的应用启动时打开它们。您还可以通过在头文件中创建 IBOutlet 引用并在 NIB 中连接它们来手动打开它们。要显示窗口,请向他们发送makeKeyAndOrderFront: 消息。要关闭它们,请向它们发送 close 方法。

要响应窗口打开/关闭,您将控制器对象指定为窗口的“委托”,这意味着它将接收来自窗口的消息,这些消息列在 NSWindowDelegate 协议下的文档中。因此,如果您想打开一个窗口以响应另一个窗口关闭,您将侦听 windowWillClose: 消息并告诉另一个窗口打开,反之亦然。

这是非常基本的东西,所以我建议你阅读 Hillegass 的书,或浏览各种 tutorialsavailableonline。

编辑:

您的应用程序正在崩溃,因为您将 otherWindow 设置为“关闭时释放”由于您处于内存管理环境中,并且没有任何东西保留窗口,下次您尝试打开它时它已经释放。解决方案是取消选中 NIB 文件中的“关闭时发布”。请注意,您还可以直接在 NIB 中将您的按钮操作连接到另一个窗口本身的 makeKeyAndOrderFront:performClose: 方法。

【讨论】:

谢谢弗朗西斯。我同意这是基本的,但我仍然没有完全了解 NIB 的工作原理。当我尝试使用 2 个 NIB 时,我发现从 NIB 内部的控制器调用 close 会正确关闭窗口,但使用外部引用(例如来自原始窗口)会看到一个空窗口。我用精确的代码编辑了我的问题。我搜索了许多教程网站,但找不到我正在尝试创建的非常基本的示例。 非常感谢弗朗西斯!正是我需要的。仍在尝试掌握 NIB 文件。【参考方案2】:

使用 XCode 4.1 中的“UINavigationController”模板或 XCode 4.2 中的“Master-Detail Application”模板创建一个新项目,看看这些东西是如何工作的。

如果您对通过查看 XCode 模板进行学习不感兴趣,请查看以下教程:http://www.iosdevnotes.com/2011/03/uinavigationcontroller-tutorial/

【讨论】:

提及“windows”表示发帖者不使用iOS。 非常感谢您的回复。也许我应该更清楚的是,我正在寻找的是 Mac 应用程序,而不是 iOS 应用程序。 话虽如此 - 我仍然会查看示例,以防有与我正在尝试做的类似的代码。 @Rick cocoa 标签暗示 Mac OS X 上的 Cocoa。对于 iOS,Apple 使用的名称是 Cocoa Touch;在 Stack Overflow 上,对应的标签是 cocoa-touch。

以上是关于Cocoa:从另一个窗口创建并关闭一个窗口的主要内容,如果未能解决你的问题,请参考以下文章

覆盖窗口关闭行为

从另一个模态打开一个模态并关闭第一个(启动)模态

关闭时从另一个应用程序打开 Spotify 主窗口

kivy - 绑定弹出窗口关闭以从另一个小部件实例中运行

更改显示的窗口 (Mac - Cocoa)

Mac Cocoa:无法释放窗口以取回其内存