Как предотвратить загрузку пера, если уже загружен экземпляр? - PullRequest
1 голос
/ 04 февраля 2011


я разрабатываю небольшое приложение. В первом окне у меня есть возможность создать новую учетную запись. Я использую кнопку «Продолжить» для этого. При нажатии этой кнопки открывается другое окно для создания новой учетной записи. Я хочу, чтобы после открытия этого окна ни один другой экземпляр этого 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 .. Условие else (последнее) ..
Я попробовал это. Я открываю NewAccountWindow, как только нажимаю на кнопку «Продолжить». Я закрываю окно и снова нажимаю кнопку продолжения. Однако на этот раз «NewAccountWindow» не открывается снова (даже существующий экземпляр не отображается).

1 Ответ

2 голосов
/ 04 февраля 2011

Стандартный подход для этого состоит в том, чтобы иметь подкласс NSWindowController (потенциально содержащий выходы для оконных виджетов), отвечающий за загрузку файла пера. Например,

@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];
}
...