如果已加载实例,如何防止nib加载?

时间:2011-02-04 06:46:11

标签: cocoa nib


我正在开发一个小应用程序。在第一个窗口中,我可以选择创建新帐户。我为此使用“继续”按钮。单击此按钮时,将打开另一个用于创建新帐户的窗口。我希望一旦打开此窗口,该nib文件的其他实例不应再次加载。即使用户再次点击“继续”,已经打开的nib文件实例(用于创建新帐户的实例)也应该出现在前面。
是否有任何API可以帮助检查是否已经加载了一个nib实例?

或者可能会给出内存中加载的所有笔尖的列表?

提前致谢...

更新:

@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条件(最后一个)..
我试过这个。单击“继续”按钮后,我打开NewAccountWindow。我关闭窗口并再次单击继续按钮。但是这次“NewAccountWindow”不再打开(即使现有的实例也没有出现)。

1 个答案:

答案 0 :(得分:2)

这样做的标准方法是让NSWindowController的子类(可能持有窗口小部件的出口)负责加载nib文件。例如,

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

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

当用户单击“继续”按钮时,您有一个处理该单击的操作方法。在包含action方法的类中,声明相应窗口控制器的实例变量:

CreateAccountWindowController *createAccountWindowController;

并且,在处理“继续”按钮点击的操作方法中,当且仅当不存在时才创建CreateAccountWindowController的实例。这将确保在任何给定时间最多存在该窗口控制器的一个实例,因此最多加载相应的nib文件一次:

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