Kakao: Mám vstup mého uživatele - co teď?

hlasů
0

Ve zkratce to, co můj program dělá, je: vykoná a trvá vstup uživatele pravidelně pomocí nswindow (který je řízen mou NSWindowController objektu) a pokračuje v provádění.

Zde je můj myController.mm který volá a zobrazení okna přijímat vstup uživatele:

EncryptPasswordDlgController encPassController = [[EncryptPasswordDlgController alloc] init];

[encPassController showWindow:self];
NSString *inputPassword = [encPassController password];

Zde je můj nswindowcontroller objektový kód:

#import EncryptPasswordDlgController.h

@implementation EncryptPasswordDlgController
-(id) init
{
    return self;
}

- (IBAction)showWindow:(id)sender
{
    [super showWindow:sender];
    encryptPasswordDlgWindowController = [[NSWindowController alloc] initWithWindowNibName:@EncryptionPasswordDlg];
    [encryptPasswordDlgWindowController loadWindow];
    [[self window] makeKeyAndOrderFront:[self window]];

    return;
}

-(IBAction)clickOK:(id) sender
{
    password = [passwordField stringValue];

    NSLog(@password is %@, password);


    [[self window] close];
    return;
}

-(NSString *)password
{   
    return password;
}

-(IBAction)clickCancel:(id) sender
{
// close the window
    password = nil;
    [[self window] close];
    //return;
}
@end

Po klepnutí na tlačítko OK nebo zrušit, příslušná metoda IBAction je stále volal a je čím dál prováděny podle potřeby, tj je zobrazeno okno přičemž uživatelský vstup z textového pole a klepnutím na tlačítko OK je aktualizovat hesla také. Ale po dokončení provádění způsobu IBAction clickOK, měl by se vrátit zpět do myController.mm a získat heslo spuštěním dalšího příkazu „NSString * inputPassword = [encPassController heslo];“ což není pravda. Prosím, může anone navrhnout způsob, jak řešit tuto situaci.

UPRAVIT:

Díky Bob za odpověď. I teď pochopil, co moje chyba byla. Takže jsem se snažil metody upozornění pomocí while, jak je uvedeno:

while(isPasswordReceivedForEncryption == NO)
{   
            sleep(10000);
            //continue;
}

v polovině mého programu tak, aby se čekat, až přijde oznámení a nastaví bool proměnnou na hodnotu true. Ale nyní problém je, že to bude do nekonečné smyčky a můj applicaton se zaseknete.

není nic jako ekvivalent MFC, kde se přímo čeká na vstup uživatele. Opravdu je to tak těžké pro vytvoření okna a získat vstup uživatele, nebo jsem opravdu chybí něco přes tu ????

Položena 26/08/2009 v 23:38
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Váš problém je, že ‚- [NSWindowController ShowWindow:]‘ neblokuje čeká na vstup okna. Tomuhle říkáš, která vypráví svou aplikaci pro zobrazení okna, ale pak se okamžitě spustí další řádek, nastavení hesla na nulu, neboť dosud nebyl nastaven.

IBAction dojde během spuštění smyčky . V podstatě je tok aplikace je:

Inicializovat App Controller -> zobrazení okna -> nastavit heslo na nulu -> Spustit útěku smyčka spoustu dob čeká na vstup - dostane stisknutím tlačítka> OK -> nastavit pole regulátory heslo -> přejít zpět do běhu smyčky.

Měli byste si přečíst až na běh smyčky, aby se pokusili pochopit, co přesně se tady děje. Výše uvedený odkaz vás naučí, co je třeba se naučit, a mnoho dalšího. Není to multithreaded, ale není spuštěn v pořadí, které očekáváte. Zjednodušeně řečeno, budete muset přeskupit je taková, že v myController.mm, počkat na vstup. To by mohlo být provedeno prostřednictvím Oznámení , nebo jen tím, že volání metody v IBAction který říká řadič heslo změnil (což je v podstatě to, co dělá Notification).

Edit: Vlastně, jakmile se tento problém odstranit, měli byste si být jisti, že budete volat ‚udržet‘ na heslo, které jste získali během IBAction, jinak se zhroutí, jakmile tento řetězec dostane autoreleased a pokusu o přístup. Příručka správy paměti

Odpovězeno 26/08/2009 v 23:52
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more