2009-08-26 2 views
0

Вкратце, что делает моя программа: она выполняет и периодически вводит пользовательский ввод, используя nswindow (который контролируется моим объектом NSWindowController) и продолжает выполнение.Какао: У меня есть вход для пользователя - Что теперь?

вот мой myController.mm, который звонит и показывает окно, чтобы принять ввод данных пользователем:

EncryptPasswordDlgController encPassController = [[EncryptPasswordDlgController alloc] init]; 

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

вот мой nswindowcontroller код объекта:

#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 

после я нажмите ОК или отменить кнопка, соответствующий метод IBAction получает вызов и выполняет выполнение по мере необходимости, т. е. отображает окно, в которое вводится пользовательский ввод из текстового поля, и при нажатии ok он также обновляет пароль. Но после того, как он завершит выполнение метода IBOction clickOK, он должен вернуться к myController.mm и получить пароль, выполнив следующий оператор «NSString * inputPassword = [encPassController password]»; чего не происходит. Можете ли вы предложить способ решить эту ситуацию.

EDIT:

спасибо Боб за ответ. Теперь я понял, какова была моя ошибка. Так я попробовал метод уведомления, используя время цикла, как показано ниже:

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

в середине моей программы так, чтобы ждать, пока уведомление приходит и устанавливает переменную Ий истина. Но теперь проблема в том, что она идет в бесконечный цикл, и мое приложение застревает.

Нет ничего похожего на эквивалент MFC, где он непосредственно ждет ввода пользователем. На самом деле это сложно создать окно и получить пользовательский ввод, или я действительно что-то пропустил здесь?

+0

Вы уже задали этот вопрос по адресу http://stackoverflow.com/questions/1337591/nswindowcontroller-program-execution.Пожалуйста, постарайтесь не публиковать новый вопрос каждый раз; используйте свой существующий поток, когда это возможно. –

ответ

1

Ваша проблема в том, что '- [NSWindowController showWindow:]' не блокирует ожидание ввода окна. Вы вызываете это, что указывает вашему приложению отображать окно, но затем он немедленно выполняет следующую строку, устанавливая пароль на нуль, поскольку он еще не установлен.

IBAction происходит во время Run Loop. В основном, поток вашего приложения:

Инициализировать App Controller -> показать окно -> установить пароль для nil -> запустить цикл запуска несколько раз, ожидая ввода -> кнопка Ok нажата -> установить поле пароля контроллеров -> вернуться к циклу запуска.

Вы должны прочитать в циклах запуска, чтобы понять, что именно происходит здесь. Вышеупомянутая ссылка научит вас тому, что вам нужно узнать, и многое другое. Это не многопоточность, но она не работает в ожидаемом порядке. В принципе, вам нужно переставить его так, чтобы в myController.mm вы ждали ввода. Это можно сделать с помощью Notifications или просто вызвав метод в IBAction, который сообщает контроллеру, что пароль был изменен (что по сути является тем, что делает уведомление).

Редактировать: На самом деле, как только вы это исправите, вы должны быть уверены, что вы вызываете «сохранить» пароль, который вы получаете во время IBAction, иначе вы сработаете после того, как эта строка получит автореализацию, и вы попытаетесь получить к ней доступ. Memory Management Guide

Смежные вопросы