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

问题描述 投票:2回答:3

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

NSWindowDidOrderOffScreenAndFinishAnimatingNotification

当表单关闭并且现在完成动画时,会发布哪个,我的问题是我可以使用它吗?或者,还有更好的方法?

我使用ARC,然后使用.xibNSWindowController加载窗口。

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

cocoa nswindow nswindowcontroller nsnotification
3个回答
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]后,动画结束,你可以做你想做的事情。


0
投票

NSWindowDidEndSheetNotification每当工作表完成动画制作时都会发布。


0
投票

从10.9开始,正确的方法是在beginSheet:completionHandler:对象上调用NSWindow

这种方法的优点是,完成处理程序是一个块,因此只要工作表仍然显示就可以保持所有对象都是活动的,一旦完成工作表并且块已经执行,块本身就是释放,因此它保持活着的所有物体也是如此。

要确保一个块保持对象存活,请使用该块中的对象,或者如果无法以有意义的方式使用它们,则将它们全部放入NSMutableArray并在块中调用removeAllObjects;这需要块来保持数组处于活动状态,并且数组使其余数据保持活动状态 - >内存管理变得简单。

© www.soinside.com 2019 - 2024. All rights reserved.