我正在开发一个小应用程序。在第一个窗口中,我可以选择创建新帐户。我为此使用“继续”按钮。单击此按钮时,将打开另一个用于创建新帐户的窗口。我希望一旦打开此窗口,该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”不再打开(即使现有的实例也没有出现)。
答案 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];
}