将NSWindow显示为表格的正确方法

时间:2013-07-19 01:47:47

标签: cocoa nswindow nswindowcontroller nsnotification

函数NSBeginAlertSheet(...)包含我需要的所有事件,特别是didDismiss:回调,但我真的需要能够对任何我想要的窗口执行相同的工作表操作,所以我发现了这个通知:

NSWindowDidOrderOffScreenAndFinishAnimatingNotification

每当工作表关闭并使用动画完成时都会发布 现在,我的问题是我可以使用它吗?或者有更好的方法吗?

我使用ARC并使用.xibNSWindowController加载窗口。

总的来说,我需要的是将一个窗口显示为工作表并捕获所有事件。

3 个答案:

答案 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}}在该数组上;这需要块使阵列保持活动状态,而阵列使其余部分保持活动状态->简化内存管理。