objective-c - NSApp 的 ModalForWindow、NSAlert 的 ModalForWindow 和 ModalSession 的提示

标签 objective-c modal-dialog nsalert nspanel

很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center .




9年前关闭。




我花了相当多的实验来消除对 Objective-C 的“ModalForWindow”语言的一些困惑,以及随后如何使用模态 session 。也许以下提示可以节省一些时间:

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

“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 中的“窗口”指的是警报将指向的窗口 作为工作表,哪个窗口将被卡住,直到警报解除。但是应用程序不会被卡住;所有其他窗口将保持可操作状态。
如果您想以表格形式附加警报和 还有
卡住应用程序的其余部分,按照 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];

(当然,您将把放弃AlertDidEnd:returnCode:contextInfo: 代码实现为类方法。)

或者,如果您希望警报作为居中面板运行,请自行调用 runModal。

假设您要运行一个面板模式,然后在用户提交无效条目时发出警报。您必须在显示警报之前停止Modal——之后,出于某种原因,对 runModalForWindow 的另一个调用无法正常工作。对于这种情况,您需要一个 模态 session :

1) 将 NSModalSession 属性添加到您的 Controller 类,因为 modalSession 必须可跨多个方法访问。

2) 显示面板后,调用 beginModalSessionForWindow 来实例化 modalSession:
self.modalSession = [[NSApplication sharedApplication] beginModalSessionForWindow:self.panelForInput];

3) 使用一个调用 runModalSession 的 while 循环,在它的返回值不等于 NSRunContinuesResponse 时中断:
while ([[NSApplication sharedApplication] runModalSession:self.modalSession] == NSRunContinuesResponse)
    continue;

当用户单击面板的按钮之一时,循环将中断并且应用程序将释放。 (在面板的文本字段中输入将使模态 session 保持不变。)

4)在你的按钮处理中,如果用户的输入无效,你用runModal调用一个alert。

5) 在警报调用的正下方,在警报解除后将执行的代码中,放置了与上面使用的相同的 while 循环。专家组的模态 session 恢复。

6) 在处理关闭面板时,无论是在有效输入还是取消时,您都调用了 endModalSession,奇怪的是,这还不够;您还必须调用 stopModal,即使您从未调用过 runModalForWindow。
[[NSApplication sharedApplication] endModalSession:self.modalSession];
[[NSApplication sharedApplication] stopModal];
[self.panelForInput close];

最佳答案

问题就是答案。我只是发布这个来关闭它。抱歉扭曲了 stackoverflow 格式。

关于objective-c - NSApp 的 ModalForWindow、NSAlert 的 ModalForWindow 和 ModalSession 的提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4979106/

相关文章:

iphone - 自定义字体在 iPhone 设备上不起作用

Swift:如何在 NSAlert 中使 NSTextField 成为第一响应者

jquery - 如何使用jquery开发是不确认

macos - 哪些字段 -[NSResponder PresentError :] show?

swift - NSAlert 中的多个 NSTextField - MacOS

ios - CLLocation didupdatetolocation 未调用

c++ - 在 GPU 中运行 C++ 代码 - Iphone 和 Android

ios - 将项目追加到 plist 中保存的 NSDictionary 中的现有键

react-native - 在一页问题上 react native 多个模态

javascript - jquery如果不存在显示div