我正在运行自定义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消息。