函数NSBeginAlertSheet(...)
具有我需要的所有事件,特别是didDismiss:
回调,但我真的需要能够对我想要的任何窗口执行相同的表单操作,所以我发现了这个通知:
NSWindowDidOrderOffScreenAndFinishAnimatingNotification
当表单关闭并且现在完成动画时,会发布哪个,我的问题是我可以使用它吗?或者,还有更好的方法?
我使用ARC,然后使用.xib
从NSWindowController
加载窗口。
总的来说,我需要的是将一个窗口显示为工作表并捕获所有事件。
怎么了?
- (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]
后,动画结束,你可以做你想做的事情。
NSWindowDidEndSheetNotification
每当工作表完成动画制作时都会发布。
从10.9开始,正确的方法是在beginSheet:completionHandler:
对象上调用NSWindow
。
这种方法的优点是,完成处理程序是一个块,因此只要工作表仍然显示就可以保持所有对象都是活动的,一旦完成工作表并且块已经执行,块本身就是释放,因此它保持活着的所有物体也是如此。
要确保一个块保持对象存活,请使用该块中的对象,或者如果无法以有意义的方式使用它们,则将它们全部放入NSMutableArray
并在块中调用removeAllObjects
;这需要块来保持数组处于活动状态,并且数组使其余数据保持活动状态 - >内存管理变得简单。