我正在寻找最简单的例子,它显示一个窗口打开另一个窗口然后关闭它。
我似乎陷入困境的地方是NIB以及如何连接插座。我可以很容易地创建窗口;关闭它是一个挑战。
任何建议都非常感谢!
我在下面附上我的代码。我认为我想要做的很简单,但它不起作用。感谢弗朗西斯,我现在可以打开和关闭窗口但是一旦我再次尝试打开它,应用程序崩溃(EXC_BAD_ACCESS
)。我确定这是因为我对NIB与班级的关系认识不足。在大多数语言中,我只需要实例化窗口的新实例然后关闭它。
MainMenu.xib
中有2个窗口。 (我更喜欢将窗口放在一个单独的NIB中,但这似乎会产生其他问题!)AppDelegate有2个出口,窗口(原始)和其他窗口(创建第2个窗口)。
第一个窗口有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
答案 0 :(得分:7)
基本上,在您的NIB中,您可以创建各种窗口,添加按钮,文本字段等。然后添加一个自定义对象,充当“控制器”,用于向窗口和各种控件发送和接收消息。在一个简单的项目中,您可以使用自动创建的AppDelegate对象来控制窗口,对于需要单独对象来处理逻辑的大型项目,可以是NSObject或NSWindowController的实例,具体取决于您的需求。
Windows可以设置为“启动时可见”,在您的应用启动时打开它们。您也可以通过在头文件中创建IBOutlet引用并在NIB中连接它们来手动打开它们。要显示窗口,请向他们发送makeKeyAndOrderFront:
消息。要关闭它们,请向它们发送close
方法。
要响应窗口打开/关闭,请将控制器对象指定为窗口“委托”,这意味着它将从窗口接收消息,这些消息在NSWindowDelegate协议下的文档中列出。因此,如果您想要打开一个窗口以响应另一个窗口关闭,您将收听windowWillClose:
消息并告诉其他窗口打开,反之亦然。
这是非常基本的东西,所以我建议你阅读Hillegass书,或者浏览一些tutorials available online。
编辑:
你的应用程序崩溃是因为你将otherWindow设置为“关闭后释放”因为你在内存管理环境中,没有任何东西保留窗口,下次你尝试打开它时它已经被释放。解决方案是取消选中NIB文件中的“关闭时释放”。请注意,您还可以将按钮操作直接连接到另一个窗口本身的makeKeyAndOrderFront:
和performClose:
方法,直接在NIB中。
答案 1 :(得分:0)
使用XCode 4.1中的“UINavigationController”模板或XCode 4.2中的“Master-Detail Application”模板创建一个新项目,并查看这些内容是如何在那里工作的。
如果您对查看XCode模板不感兴趣,请查看以下教程:http://www.iosdevnotes.com/2011/03/uinavigationcontroller-tutorial/