2011-02-04 20 views
1


私は小さなアプリケーションを開発しています。最初のウィンドウでは、新しいアカウントを作成するオプションがあります。私はこのために "続行"ボタンを使用します。このボタンをクリックすると、新しいアカウントを作成するための別のウィンドウが開きます。このウィンドウを開くと、このnibファイルの他のインスタンスは再びロードされません。ユーザーが「続行」を再度クリックしても、すでに開いているnibファイルのインスタンス(新しいアカウントを作成するインスタンス)が前面に表示されます。
nibのインスタンスが既にロードされているかどうかを確認するのに役立つAPIはありますか?すでにインスタンスがロードされている場合、ペン先がロードされないようにするにはどうすればよいですか?

または、メモリにロードされているすべてのペン先の一覧を示すものがありますか?事前に

おかげで...

UPDATE:

@interface WelcomePageController : NSObject { 
    IBOutlet NSTextField * userNameField; 
    IBOutlet NSPopUpButton * actionList; 

    IBOutlet NSWindow * welcomePage; 

    CreateNewAccountWindowController * createNewAccountWindowController; 

} 

-(IBAction) changePasswordButton:(id)sender; 
-(IBAction) logOutButton:(id)sender; 
-(IBAction) continueButton:(id)sender; 
@end 


@implementation WelcomePageController 



-(void)windowDidUpdate:(id)sender{ 
    UserInfo * user=[UserInfo uInfoObject]; 
    [userNameField setStringValue:[user.firstName stringByAppendingFormat:@" %@!", user.lastName]]; 
    if ([user.userType isEqual:@"Standard"]) { 
     [actionList setAutoenablesItems:NO]; 
     [[actionList itemAtIndex:2]setEnabled:NO]; 
     [[actionList itemAtIndex:3]setEnabled:NO]; 
    } 
    else { 
     [actionList setAutoenablesItems:YES]; 
    } 

} 


-(IBAction) changePasswordButton:(id)sender{ 
    [NSBundle loadNibNamed:@"ChangePassword" owner:self]; 
} 


-(IBAction) continueButton:(id)sender{ 
    if ([actionList indexOfSelectedItem]==0) { 
     [NSBundle loadNibNamed:@"ViewAvailableItemsWindow" owner:self]; 
    } 
    else if([actionList indexOfSelectedItem]==1){ 
     [NSBundle loadNibNamed:@"NewOrderPage" owner:self]; 
    } 
    else if([actionList indexOfSelectedItem]==2){ 
     [NSBundle loadNibNamed:@"ManageItemList" owner:self]; 
    } 
    else { 
     if(!createNewAccountWindowController){ 
      createNewAccountWindowController=[[CreateNewAccountWindowController alloc]init]; 
     } 
     [createNewAccountWindowController showWindow:self]; 

     //[NSBundle loadNibNamed:@"NewAccount" owner:self]; 
    } 

} 


-(IBAction) logOutButton:(id)sender{ 
    [NSBundle loadNibNamed:@"LoginPage" owner:self]; 
    [[sender window]close]; 
} 
@end 

これは私が使用しています完全なコードです....問題のコードは、(メソッドcontinueButton..The else条件であります最後のもの)..
私はこれを試しました。私はContinueボタンをクリックするとNewAccountWindowを開きます。ウィンドウを閉じて、[続行]ボタンをもう一度クリックします。しかし、今回は "NewAccountWindow"が再び開きません(既存のインスタンスが表示されなくても)。

答えて

2

これの標準的なアプローチは、NSWindowControllerのサブクラス(潜在的にウィンドウウィジェットのアウトレットを保持)がnibファイルのロードを担当することです。たとえば、

@interface CreateAccountWindowController : NSWindowController { 
    // … 
} 
// … 
@end 

@implementation CreateAccountWindowController 
- (id)init { 
    self = [super initWithWindowNibName:@"CreateAccount"]; 
    return self; 
} 
// … 
@end 

ユーザーが[続行]ボタンをクリックすると、そのクリックを処理するアクションメソッドがあります。アクションメソッドを含むクラスにおいて、対応するウィンドウコントローラのインスタンス変数を宣言:

CreateAccountWindowController *createAccountWindowController; 

と、続行ボタンのクリックを処理するアクションメソッドで、かつ専用なしもしあればCreateAccountWindowControllerのインスタンスを作成しますまだ存在する。

- (IBAction)showCreateAccountWindow:(id)sender { 
    if (! createAccountWindowController) { 
     createAccountWindowController = [[CreateAccountWindowController alloc] init]; 
    } 
    [createAccountWindowController showWindow:self]; 
} 
+0

これは、CreateAccountウィンドウを一度しか開きたくない場合に役立ちます。これは、このウィンドウコントローラのインスタンスが最大で1つ存在することを保証します。何が起こるかは、ウィンドウを開いて閉じてからもう一度開こうとすると開きません。これは、createAccountWindowControllerオブジェクトがまだ生きているからです...私はこの全体のメソッドがちょっと面倒だと感じています。他の方法を考えることができますか? –

+0

@Sahityaなぜこのメソッドはウィンドウを1回だけ開くことができると思いますか?ウィンドウは1回だけ生成され、 'showCreateAccountWindow'が呼び出されるたびに表示されます。' -showWindow: 'は' if'構造体の外側でウィンドウコントローラに送られます。つまり、ウィンドウは常にそのメソッドの結果として表示されます呼び出されています。質問を編集して、使用しているコードを投稿できますか? –

+0

申し訳ありませんが、後半の応答!私はコードで質問を更新しました..更新を見て、私が試していたwatを知っています...ありがとう:) –

関連する問題