函数NSBeginAlertSheet(...)
包含我需要的所有事件,特别是didDismiss:
回调,但我真的需要能够对任何我想要的窗口执行相同的工作表操作,所以我发现了这个通知:
NSWindowDidOrderOffScreenAndFinishAnimatingNotification
每当工作表关闭并使用动画完成时都会发布 现在,我的问题是我可以使用它吗?或者有更好的方法吗?
我使用ARC并使用.xib
从NSWindowController
加载窗口。
总的来说,我需要的是将一个窗口显示为工作表并捕获所有事件。
答案 0 :(得分:2)
有什么问题
- (void)beginSheet:(NSWindow *)sheet modalForWindow:(NSWindow *)docWindow modalDelegate:(id)modalDelegate didEndSelector:(SEL)didEndSelector contextInfo:(void *)contextInfo
这会调用可选的didEndSelector
,它应如下所示:
- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
这是NSApplication
文档中的全部内容。结束工作表有两种方法:
- (void)endSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode
- (void)endSheet:(NSWindow *)sheet
所以你可以在调用endSheet:
之前做任何你想做的事情,或者你可以用sheetDidEnd:
方法。
修改强>
Here是一个示例项目,显示在调用[window orderOut:self]
之后,动画已完成,您可以按照自己喜欢的方式进行操作。
答案 1 :(得分:0)
NSWindowDidEndSheetNotification
每当工作表完成动画制作时都会发布。
答案 2 :(得分:0)
从10.9开始,正确的方法是在addEventListener
对象上调用removeEventListener
。
此方法的优点在于,完成处理程序是一个块,因此,只要仍显示工作表,并且完成工作表并执行了该块,它就可以使所需的所有对象保持活动状态。块本身被释放,因此它一直存在的所有对象也都被释放了。
要确保某个块使对象保持活动状态,请使用该块内的对象,或者如果无法以有意义的方式使用它们,请将所有对象放入var touchMove = function(e){
e.preventDefault();
};
document.addEventListener('touchmove', touchMove, { passive: false });
document.removeEventListener('touchmove', touchMove);
并在块调用{{ 1}}在该数组上;这需要块使阵列保持活动状态,而阵列使其余部分保持活动状态->简化内存管理。