Ric*_*ker 1 macos cocoa objective-c nswindow appdelegate
我正在寻找一个最简单的例子,它显示一个窗口打开另一个窗口,然后关闭它.
我似乎陷入困境的地方是NIB以及如何连接插座.我可以很容易地创建窗口; 关闭它提出了挑战.
任何建议非常感谢!
我在下面附上我的代码.我认为我想要做的很简单,但它不起作用.感谢弗朗西斯,我现在可以打开和关闭窗口但是一旦我再次尝试打开它,应用程序崩溃(EXC_BAD_ACCESS).我确定这是因为我对NIB与班级的关系认识不足.在大多数语言中,我只需要实例化窗口的新实例然后关闭它.
我有2个窗户MainMenu.xib.(我更喜欢将窗口放在单独的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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
基本上,在您的NIB中,您可以创建各种窗口,添加按钮,文本字段等.然后添加一个自定义对象,充当"控制器",用于向窗口和各种控件发送和接收消息.在一个简单的项目中,您可以使用自动创建的AppDelegate对象来控制窗口,对于需要单独对象来处理逻辑的大型项目,可以是NSObject或NSWindowController的实例,具体取决于您的需要.
Windows可以设置为"启动时可见",在您的应用启动时打开它们.您也可以通过在头文件中创建IBOutlet引用并在NIB中连接它们来手动打开它们.要显示窗口,请向他们发送makeKeyAndOrderFront:消息.要关闭它们,请向它们发送一种close方法.
要响应窗口打开/关闭,您将控制器对象指定为窗口"委托",这意味着它将从窗口接收消息,这些消息在NSWindowDelegate协议下的文档中列出.因此,如果您想要打开一个窗口以响应另一个窗口关闭,您将监听该windowWillClose:消息并告诉其他窗口打开,反之亦然.
这是非常基本的东西,所以我建议你阅读Hillegass书,或浏览一些在线提供的各种教程 .
编辑:
您的应用程序崩溃是因为您将otherWindow设置为"关闭时释放"由于您处于内存管理环境中,并且没有任何内容保留窗口,因此下次尝试打开它时,它已被释放.解决方案是取消选中NIB文件中的"关闭时释放".请注意,您还可以直接在NIB中将按钮操作makeKeyAndOrderFront:与performClose:其他窗口本身的方法连接起来.
| 归档时间: |
|
| 查看次数: |
5443 次 |
| 最近记录: |