0

ウィンドウを切り替えたいシンプルなMacアプリを作っています。
2つのNSWindowControllerクラスMainWindowDetailWindow

私はこのコードを使用しています:

MainWindowクラス:

//MainWindow.h
@class DetailWindow;
@interface MainWindow : NSWindowController{

    IBOutlet NSButton *btn1;
    DetailWindow *detailwindow;
}
@property (nonatomic, retain) IBOutlet NSButton *btn1;
- (IBAction)btn1Event:(id)sender;

//MainWindow.m

@implementation MainWindow
@synthesize btn1;

- (IBAction)btn1Event:(id)sender {

if (!detailwindow) {
    detailwindow = [[DetailWindow alloc] initWithWindowNibName:@"DetailWindow"];

}
    [detailwindow showWindow:self];
}
@end

DetailWindowクラス:

//DetailWindow.h
@class MainWindow;
@interface DetailWindow : NSWindowController{

    IBOutlet NSButton *backbtn;
    MainWindow *mainwindow;
}
@property (nonatomic, retain) IBOutlet NSButton *backbtn;
- (IBAction)back:(id)sender;

//DetailWindow.m

@implementation DetailWindow
@synthesize backbtn;

- (IBAction)back:(id)sender {

if (!mainwindow) {
    mainwindow = [[MainWindow alloc] initWithWindowNibName:@"MainWindow"];

}
    [mainwindow showWindow:self];
}
@end

問題は、クリックbackbtn on DetaiWindowすると新しいが開くことMainWindowです。
だから私はMainWindow画面に2つあります。
backbtnをクリックしたときに前面にメインウィンドウだけが必要です。

何か助けは?

ありがとうございました..!!

4

2 に答える 2

1

あなたの基本的な問題は、各ウィンドウが他のウィンドウを作成するのはそれ自身の仕事であると想定していることです。それぞれに他の ivar がありますが、外部からアクセスすることはできません (プロパティまたはその他のものを介して)。IBOutletそのため、常に として開始されnil、古いコピーを再利用する代わりに新しいコピーが作成されます。

これを回避する方法はいくらでもあります。おそらく最も簡単な方法は、Interface Builder で両方のウィンドウを作成し、そこにリンクして ivar を作成することですIBOutlet。そうすれば、コードでそれらを作成する必要がまったくないことがわかります。

ただし、純粋に慣性に基づいて、既に得ているものにより近い代替案を次に示します。mainWindow簡単にするために、 が常に最初に存在すると仮定していることに注意してください。そうでない場合は、プロセスを逆に複製する必要があります。

//MainWindow.h
@class DetailWindow;
@interface MainWindow : NSWindowController
{

    IBOutlet NSButton *btn1;
    DetailWindow *detailwindow;
}
@property (nonatomic, retain) NSButton *btn1;
- (IBAction)btn1Event:(id)sender;

//MainWindow.m

@implementation MainWindow
@synthesize btn1;

- (IBAction)btn1Event:(id)sender
{
    if (!detailwindow)
    {
        detailwindow = [[DetailWindow alloc] initWithWindowNibName:@"DetailWindow"];

        // having created the other window, give it a reference back to this one
        detailWindow.mainWindow = self;
    }

    [detailwindow showWindow:self];
}
@end

//DetailWindow.h
@class MainWindow;
@interface DetailWindow : NSWindowController
{

    IBOutlet NSButton *backbtn;
    MainWindow *mainwindow;
}
@property (nonatomic, retain) NSButton *backbtn;

// allow the main window to be set from outside
@property (nonatomic, retain) MainWindow *mainWindow;
- (IBAction)back:(id)sender;

//DetailWindow.m

@implementation DetailWindow
@synthesize backbtn;
@synthesize mainWindow;

- (IBAction)back:(id)sender
{
    // no window creation on the way back
    NSAssert(mainWindow, "mainWindow not set!");
    [mainwindow showWindow:self];
}
@end

テストされていないため、通常の警告が適用されます。

于 2011-09-20T09:46:20.947 に答える