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 方法并按要求执行,即它显示窗口从文本字段中获取用户输入,单击“确定”时它也在更新密码。但是在它执行完 IBAction clickOK 方法之后,它应该返回到 myController.mm 并通过执行下一条语句“NSString *inputPassword = [encPassController password];”来检索密码 这没有发生。请有人提出解决这种情况的方法。

编辑:

感谢鲍勃的回复。我现在明白我的错误是什么了。所以我通过使用while循环尝试了通知方法,如下所示:

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

在我的程序中间等待通知到来并将bool变量设置为true。但现在的问题是它进入了无限循环,我的应用程序被卡住了。

有没有像 MFC 等价物直接等待用户输入的东西。真的很难创建一个窗口并获得用户输入还是我真的错过了这里的东西????

4

1 回答 1

1

您的问题是 '-[NSWindowController showWindow:]' 不会阻止等待窗口输入。您调用它,它告诉您的应用程序显示窗口,但随后它立即执行下一行,将密码设置为 nil,因为它尚未设置。

IBAction 发生在Run Loop期间。基本上,您的应用程序的流程是:

初始化 App Controller -> 显示窗口 -> 将密码设置为 nil -> 多次运行 Run Loop 等待输入 -> 按下确定按钮 -> 设置控制器密码字段 -> 回到运行循环。

您应该阅读运行循环以尝试了解这里到底发生了什么。上面的链接将教您需要学习的内容以及更多内容。它不是多线程的,但它没有按照您期望的顺序运行。基本上,您需要重新排列它,以便在 myController.mm 中等待输入。这可以通过Notifications来完成,或者只是通过调用 IBAction 中的一个方法来告诉控制器密码已更改(这本质上是 Notification 所做的)。

编辑:实际上,一旦你解决了这个问题,你应该确保在 IBAction 期间获得的密码上调用“保留”,否则一旦该字符串被自动释放并尝试访问它,你就会崩溃。内存管理指南

于 2009-08-26T22:52:28.587 回答