2011-02-04 88 views
1


我正在開發一個小應用程序。在第一個窗口中,我可以選擇創建一個新帳戶。我爲此使用了一個「繼續」按鈕。點擊此按鈕後,將打開另一個用於創建新帳戶的窗口。我希望一旦打開此窗口,就不會再加載此nib文件的其他實例。即使用戶再次點擊「繼續」,已經打開的nib文件實例(用於創建新帳戶的實例)應該在前面。
有沒有任何API可以幫助檢查一個nib實例是否已經加載?如果已經加載實例,如何防止加載一個筆尖?

或者可能是給出了內存中加載的所有nib列表的東西?

在此先感謝...

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其他條件(最後一個)..
我試過這個。我點擊繼續按鈕後打開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窗口只有一次。會發生什麼事是,如果我打開窗口,關閉它,然後嘗試再次打開它,它不會打開。這是因爲createAccountWindowController對象仍然存在......我覺得這整個方法有點太乏味了......你能想出任何其他方式嗎? – 2011-02-04 08:57:28