关于NSApp的ModalForWindow,NSAlert的ModalForWindow以及ModalSession的提示

31

为了弄清楚Objective-C中“ModalForWindow”语言的含义以及如何使用模态会话,我进行了相当多的实验。也许以下提示可以帮助其他人节省一些时间:

(如果你对这个概念还不熟悉:当一个窗口(通常是面板)运行模态时,它会阻止应用程序的某些其他部分响应,直到它被关闭。)

在不同情况下,“ModalForWindow”的含义是不同的。 如果你使用loadNibNamed来显示由xib定义的面板并想使其模态运行,请在面板显示之后调用以下方法:

// Make panelReviewImports modal, so that no other part of app will respond.
[[NSApplication sharedApplication] runModalForWindow:self.panelReviewImports];

并在其解雇方法中跟进:

[[NSApplication sharedApplication] stopModal];

对于NSAlert,beginSheetModalForWindow中的“window”指的是警告框将被附加为一个sheet的窗口,该窗口在警告框被关闭之前将会被冻结。但是应用程序不会被冻结;所有其他窗口仍然可以操作。 如果您想将警告框作为sheet附加,并且还想冻结应用程序的其余部分,请在beginSheet代码后面使用runModal方法进行简单的调用,并显式地使用返回代码,像这样:

[alert beginSheetModalForWindow:self.window 
                  modalDelegate:self didEndSelector:@selector(abandonmentAlertDidEnd:returnCode:contextInfo:) 
                    contextInfo:nil];
NSInteger returnCode = [alert runModal];
[self abandonmentAlertDidEnd:alert returnCode:returnCode contextInfo:nil];
(当然,你已经实现了abandonmentAlertDidEnd:returnCode:contextInfo:代码作为类方法。)
或者,如果你希望弹出窗口居中运行,只需调用runModal。
假设您想要运行一个面板模式,如果用户提交无效条目,则跟随一个警报。在显示警报之前,您必须停止modal(模态),但之后由于某种原因,再次调用runModalForWindow无法正常工作。对于这种情况,您需要一个模态会话
1)将NSModalSession属性添加到您的控制器类中,因为modalSession必须在多个方法之间可访问。
2)一旦您显示了面板,请调用beginModalSessionForWindow来实例化modalSession:
self.modalSession = [[NSApplication sharedApplication] beginModalSessionForWindow:self.panelForInput];

3) 接下来使用while循环调用runModalSession,当其返回值不等于NSRunContinuesResponse时退出:

while ([[NSApplication sharedApplication] runModalSession:self.modalSession] == NSRunContinuesResponse)
    continue;

当用户单击面板按钮时,循环将会中断并释放应用程序(在面板文本字段中输入不会改变模态会话)。

4)在您的按钮处理中,如果用户输入无效,您需要使用runModal调用警告。

5)紧接着警告调用,在警告被解除后执行的代码中,需要放置与上面使用的while循环相同的代码。面板的模态会话将会恢复。

6)在您处理关闭面板的过程中,无论是有效输入或取消操作,都需要调用endModalSession,但奇怪的是这还不够;您还必须调用stopModal,尽管您从未调用过runModalForWindow。

[[NSApplication sharedApplication] endModalSession:self.modalSession];
[[NSApplication sharedApplication] stopModal];
[self.panelForInput close];
1个回答

3
问题即答案。我只是发布这个来结束它。抱歉扭曲了stackoverflow的格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接