Interface Builder で作成されたウィンドウをロードすることから始まる Objective C アプリケーションがあります。
//in main()
[NSApplication sharedApplication];
[NSBundle loadNibNamed:@"MainMenu" owner:NSApp];
[NSApp run];
MainMenu.xib には、ボタン付きのウィンドウがあります。そのボタンが押されたときに、プログラムで 2 番目のウィンドウを作成したいと考えています。
//in MainMenu.xib Controller.h
@class SecondWindowController;
@interface Controller: NSWindowController {
@private
SecondWindowController *sw;
}
- (IBAction)onButtonPress:(id)object;
@end
//in MainMenu.xib Controller.m
#import "SecondWindowController.h"
@implementation Controller
- (IBAction)onButtonPress:(id)object {
sw = [[SecondWindowController alloc] initWithWindowNibName:@"SecondWindow"];
[sw showWindow:self];
[[self window] orderOut:self];
}
@end
SecondWindowController は NSWindowController から継承します。SecondWindowController.h には次のものがあります。
- (id)initWithWindow:(NSWindow*)window {
self = [super initWithWindow:window];
if (self) {
NSRect window_rect = { {custom_height1, custom_width1},
{custom_height2, custom_width2} };
NSWindow* secondWindow = [[NSWindow alloc]
initWithContentRect:window_rect
styleMask: ...
backing: NSBackingStoreBuffered
defer:NO];
}
return self;
}
そして SecondWindow.xib には何もありません。最初のウィンドウのボタンが押されると、最初のウィンドウが消え、アプリケーションが閉じます。2 番目のウィンドウに Interface builder を使用したくない理由は、プログラムで初期化したいからです。これは可能ですか?もしそうなら、これを達成する正しい方法は何ですか?