我正在运行自定义NSWindowController作为模式窗口。

首先,我将其显示为:

ProgressWindow *pWin = [[ProgressWindow alloc] initWithWindowNibName:@"ProgressWindow" andXmlContent:nil];
[NSApp runModalForWindow:[pWin window]];


然后我想从ProgressWindow的NSWindowController中消除它。为此,我在windowDidLoad函数中设置以下代码(仅用于测试):

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
[self testMethod];


不出所料,它会在2秒后调用testMethod。该方法应关闭模式窗口,但我似乎找不到解决方法。我尝试了[NSApp stopModal][NSApp abortModal][self close],使其成为工作表并调用[self.window orderOut:nil];[NSApp endSheet:self.window];,但似乎没有任何效果。没有任何反应或在其他位置重新打开了窗口。我不知道为什么会这样,初始化代码仅被调用一次。

有谁知道如何关闭它???

最佳答案

我相信您以错误的方式使用了RunLoop。 RunLoop是一个循环,用于管理App中GUI小部件的显示和交互,如果停止主RunLoop,则您的App将停止更新。

由于您正在使用runUntilDate,因此由于主RunLoop已停止,因此您正在停止GUI更新的处理。

要获得所需的功能,您可以在运行循环中使用addTimer或将单独的NSTimer与参数选择器一起使用,以启动stopModal消息。

08-18 09:31