Cacau: Eu tenho a entrada do meu usuário - E agora?

votos
0

Em poucas palavras o que o meu programa faz é: ele executa e leva a entrada do usuário periodicamente usando NSWindow (que é controlada pelo meu objeto NSWindowController) e continua a execução.

aqui está a minha myController.mm que está chamando e mostrar a janela para receber a entrada de usuário:

EncryptPasswordDlgController encPassController = [[EncryptPasswordDlgController alloc] init];

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

aqui é o meu código nswindowcontroller objeto:

#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

depois que eu clique no botão OK ou Cancelar, o respectivo método IBAction está sendo chamado e está sendo executado conforme exigido ou seja, ele está mostrando a janela levando a entrada do usuário do campo de texto, depois clicar em ok ele está atualizando a senha também. Mas depois que ele termina a execução do método IBAction emOK, ele deve voltar para myController.mm e recuperar a senha executando a próxima instrução NSString * inputPassword = [senha encPassController]; o que não está acontecendo. Por favor anone pode sugerir uma maneira de lidar com esta situação.

EDITAR:

Graças Bob para a resposta. Agora eu entendia que meu erro foi. Assim i tentou o método de notificação usando um laço enquanto como mostrado:

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

no meio do meu programa, de modo a esperar até que a notificação vem e define a variável bool para true. Mas agora o problema é que ele está entrando em loop infinito e minha applicaton é ficar preso.

há nada como o equivalente MFC onde espera directamente para a entrada do usuário. Realmente é que difícil criar uma janela e obter entrada do usuário ou estou realmente faltando alguma coisa aqui ????

Publicado 26/08/2009 em 23:38
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Seu problema é que '- [NSWindowController SHOWWINDOW:]' não bloqueia aguardando pela entrada janela. Você chama isso, o que diz seu aplicativo para mostrar a janela, mas então imediatamente executa a próxima linha, a definição da senha a zero, uma vez que não foi definido ainda.

O IBAction ocorre durante um Run loop . Basicamente, o fluxo de seu aplicativo é:

Inicializar App Controller -> mostrar a janela - password> definir a zero -> executar o Run loop um monte de tempo de espera para a entrada -> botão OK fica pressionado -> defina o campo controladores de senha -> voltar ao lacete prazo.

Você deve ler-se no prazo loops para tentar entender o que exatamente está acontecendo aqui. O link acima vai ensinar o que você precisa para aprender, e muito mais. Não é multithreaded, mas não está em execução na ordem que você espera. Basicamente, você precisa reorganizar-lo de tal forma que em myController.mm, você espera para a entrada. Isso poderia ser feito por meio de Notificações , ou apenas chamando um método no IBAction que indica ao controlador a senha foi alterada (que é essencialmente o que o Notificação faz).

Edit: Na verdade, uma vez que você corrigir isso, você deve ter certeza que você chama de 'reter' na senha que você começa durante a IBAction, caso contrário, você irá falhar uma vez que String Obtém autoreleased e você tentar acessá-lo. Guia de Gerenciamento de memória

Respondeu 26/08/2009 em 23:52
fonte usuário

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