Какао: я получил вклад моего пользователя - и что теперь? - PullRequest
0 голосов
/ 27 августа 2009

В двух словах, что делает моя программа: она периодически выполняет пользовательский ввод, используя 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 и выполняется по мере необходимости, т. Е. Он показывает окно, принимающее ввод данных пользователем из текстового поля, а при нажатии кнопки «ОК» также обновляется пароль. Но после того, как он завершит выполнение метода clickAK IBAction, он должен вернуться к myController.mm и получить пароль, выполнив следующую инструкцию «NSString * inputPassword = [пароль encPassController];» чего не происходит. Пожалуйста, кто-нибудь может предложить способ справиться с этой ситуацией.

EDIT:

Спасибо Бобу за ответ. Теперь я понял, в чем была моя ошибка. Итак, я попробовал метод уведомления с помощью цикла while, как показано:

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

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

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

1 Ответ

1 голос
/ 27 августа 2009

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

IBAction происходит во время цикла выполнения . По сути, поток вашего приложения:

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

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

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

...