2011-09-15 26 views
0

私はウィンドウを切り替える簡単なMacアプリケーションを作っています。
私はこのコードを使用しています2つのNSWindowControllerクラスMainWindowDetailWindow2つのNSWindowを切り替える

を持っている:

メイン・ウィンドウクラス:

//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を2つ持っています。
backbtnをクリックするとメインウィンドウが前面に表示されます。

ありがとうございます!

+0

いいえ.......... – iUser

+0

'DetailWindow'クラスで宣言された' mainWindow'はどこですか? –

+0

'backbtn'を宣言した後..質問を編集させてください。 – iUser

答えて

1

あなたの基本的な問題は、各ウィンドウは、別のウィンドウを作成する独自のジョブであると想定していることです。それぞれにはもう一方の象牙がありますが、外部のアクセスはありません。プロパティまたはIBOutletまたはその他のものを経由しているため、常にnilとして始まり、古いものを再利用する代わりに新しいコピーが作成されます。

これを回避する方法はいくつもあります。おそらく最も簡単なのは、Interface Builderで両方のウィンドウを作成し、そこにリンクして、ivarsを作成したことです。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 

未評価なので、通常の警告が適用されます。

+0

ありがとうございました!このコードは正常に動作しています.. !! :) – iUser

-1

メインウィンドウのselfオブジェクトでorderFront:メソッドを呼び出す必要があります。

これを行うには、メインウィンドウへの参照を見つける必要があります。これを行う方法は次のとおりです。

[NSApp mainWindow]; 

この呼び出しは、あなたが間違った何かをした場合、あなたはあなたのために検索するために[NSApp窓]配列を順番に持つことができる(あなたのメインウィンドウにあなたのポインタを返します。メインウィンドウ)。

ウィンドウが見つかったら、上記のコードが前述のように正しいウィンドウを返すと仮定して、orderFrontメッセージを送信します。

そして、ウィンドウは魔法のように前方に並べるべきです。

+0

コードを書けますか?私はこれに非常に新しいです!!あなたが言ったことを試みたが、私は何か間違っていると思う..まだMainWindowを正面に作ることができない。 – iUser

+0

は動作しません! – iUser

+0

あなたはwindows配列のすべてのウィンドウにorderfront呼び出しを送信しようとしましたか? – edo42

関連する問題