3

どうやってするの?ウィンドウをロードして、メインウィンドウの前に表示したいだけです。

NSWindowController* controller = [[NSWindowController alloc] initWithWindowNibName: @"MyWindow"];
NSWindow* myWindow = [controller window];
[myWindow makeKeyAndOrderFront: nil];

このコードは、ウィンドウを一瞬表示してから非表示にします。私見これは、私がウィンドウを参照し続けていないためです(私はを使用していますARC)。[NSApp runModalForWindow: myWindow];完璧に動作しますが、モーダルで表示する必要はありません。

4

2 に答える 2

6

はい、ARC では、ウィンドウへの参照を保持していない場合、使用していたルーチンを終了するとすぐに破棄されます。ivar でウィンドウへの強い参照を保持する必要があります。オブジェクトがモーダルに実行されている限り、ウィンドウへの参照を保持する[NSApp runModalForWindow: myWindow]ためです。NSApplication

于 2012-08-16T15:34:24.130 に答える
1

次のようにして、作成したインスタンスstrongへの参照を作成する必要があります。NSWindowController

.h:

@class MDWindowController;
@interface MDAppDelegate : NSObject <NSApplicationDelegate> {
    __weak IBOutlet NSWindow        *window;
    MDWindowController              *windowController;
}
@property (weak) IBOutlet NSWindow *window;
@property (strong) MDWindowController *windowController;

- (IBAction)showSecondWindow:(id)sender;
@end

.m:

#import "MDAppDelegate.h"
#import "MDWindowController.h"

@implementation MDAppDelegate

@synthesize window;
@synthesize windowController;

- (IBAction)showSecondWindow:(id)sender {
    if (windowController == nil) windowController =
                        [[MDWindowController alloc] init];
    [windowController showWindow:nil];
}

@end

makeKeyAndOrderFront:メソッドを の に直接送信するNSWindowControllerのではなく、の組み込みメソッドをそのままNSWindow使用できることに注意してください。NSWindowControllershowWindow:

上記のコード (および以下のサンプル プロジェクト) では のカスタム サブクラスをNSWindowController使用していますが、ジェネリックも使用して を使用NSWindowControllerしてインスタンスを作成しますinitWithWindowNibName:(nib ファイルのファイルの所有者が のNSWindowControllerようなカスタム サブクラスではなくに設定されていることを確認してMDWindowControllerください)。

サンプル プロジェクト:

http://www.markdouma.com/developer/MDWindowController.zip

于 2012-08-16T16:02:50.170 に答える