It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center。
已关闭8年。
我花了很多时间进行实验,以消除对Objective-C的“ModalForWindow”语言以及随后如何使用模式 session 的困惑。也许以下技巧可以节省一些时间:
(如果您是这个概念的新手,则当窗口(通常是面板)以模式运行时,它会阻止应用程序的其他部分响应,直到将其关闭为止。)
“ModalForWindow”在不同情况下意味着不同的事物。
如果使用loadNibNamed显示由xib定义的面板,并且希望它以模式运行,则在显示面板时调用它:
并在其解雇方法中对此进行跟进:
但是对于NSAlert,beginSheetModalForWindow中的“窗口”是指将警报附加到(作为工作表)的所在的窗口,该窗口将被冻结,直到解除警报为止。但是应用不会被冻结;所有其他窗口将保持可操作状态。
如果您想将警报作为工作表附加,也
冻结应用程序的其余部分,通过简单调用runModal来遵循beginSheet代码,并显式使用返回代码,如下所示:
(当然,您将实现abandonmentAlertDidEnd:returnCode:contextInfo:代码作为类方法。)
或者,如果您希望警报作为居中面板运行,请自行调用runModal。
假设您要运行面板模式,然后在用户提交无效条目时发出警报。在显示警报之前,您必须先stopModal-之后,由于某种原因,另一个对runModalForWindow的调用将无法正常工作。对于这种情况,您需要一个模态 session :
1)将NSModalSession属性添加到您的 Controller 类,因为modalSession必须可以通过多种方法访问。
2)一旦显示了面板,请调用beginModalSessionForWindow来实例化modalSession:
3)接下来是一个调用runModalSession的while循环,当其返回值不等于NSRunContinuesResponse时中断:
当用户单击面板的按钮之一时,循环将中断并且应用程序将释放。 (在面板的文本字段中键入将使模式 session 保持不变。)
4)在按钮处理中,如果用户输入无效,则使用runModal调用警报。
5)在警报调用的紧下方,在解除警报后将执行的代码中,将与上面使用的while循环相同。小组的模式 session 恢复。
6)在关闭面板的处理过程中,无论是有效输入还是取消操作,都调用endModalSession,奇怪的是,这还不够;即使您从未调用过runModalForWindow,也必须调用stopModal。
已关闭8年。
我花了很多时间进行实验,以消除对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中的“窗口”是指将警报附加到(作为工作表)的所在的窗口,该窗口将被冻结,直到解除警报为止。但是应用不会被冻结;所有其他窗口将保持可操作状态。
如果您想将警报作为工作表附加,也
冻结应用程序的其余部分,通过简单调用runModal来遵循beginSheet代码,并显式使用返回代码,如下所示:
[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。
假设您要运行面板模式,然后在用户提交无效条目时发出警报。在显示警报之前,您必须先stopModal-之后,由于某种原因,另一个对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调用警报。
5)在警报调用的紧下方,在解除警报后将执行的代码中,将与上面使用的while循环相同。小组的模式 session 恢复。
6)在关闭面板的处理过程中,无论是有效输入还是取消操作,都调用endModalSession,奇怪的是,这还不够;即使您从未调用过runModalForWindow,也必须调用stopModal。
[[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/
10-09 16:18