0

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 を使用したくない理由は、プログラムで初期化したいからです。これは可能ですか?もしそうなら、これを達成する正しい方法は何ですか?

4

1 に答える 1

0

OK、私は最初、あなたが NIB ファイルからウィンドウをロードしようとするあなたの使用に混乱してinitWithWindowNibName:@"SecondWindow"いましたが、後でやりたくないと言っていました。

これを使用してウィンドウを作成してください:

- (IBAction)onButtonPress:(id)object {
    if (!sw)
        sw = [[SecondWindowController alloc] init];
    [sw showWindow:self];
    [[self window] orderOut:self];
}

これにより、不要なウィンドウコントローラーの複数のコピーを作成することを回避できます (作成する場合は、それらを配列に格納する必要があります)。sw名前は慣例により間違っていることに注意してください。どちら_swかを使用するか、setter/getter メソッドを作成して使用しますself.sw

次のように初期化SecondWindowControllerします。

- (id)init {
    NSRect window_rect = NSMakeRect(custom_x, custom_y,
                                    custom_width, custom_height);
    NSWindow* secondWindow = [[NSWindow alloc] 
                         initWithContentRect:window_rect
                         styleMask: ...
                         backing: NSBackingStoreBuffered
                         defer:NO];                         

    self = [super initWithWindow:secondWindow];
    if (self) {
         // other stuff
    }
    return self;
}

注: 新しいウィンドウの原点/サイズの変数名が間違っていました。それらを確認してください。

于 2013-10-28T15:31:28.303 に答える