beginSheetModalForWindow

beginSheetModalForWindow

在Xcode 5.0.2中设置要显示为模式表的NSAlert对象时,我遇到了一个有趣的惊喜。

我打算使用beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:

当我开始输入它时,Xcode会自动为我填充beginSheetModalForWindow:completionHandler:(即使我在任何NSAlert文档中都找不到)。

我更喜欢使用完成处理程序而不是委托/选择器作为回调机制,因此我继续尝试一下。我惊喜地发现它运行良好。

在我致力于此之前,请先回答三个问题。


我在文档中缺少什么吗?
如果没有记录,使用此功能是否“安全”? (即,它会像看起来一样神秘地消失吗?)
我宁愿不根据通过日志记录看到的内容对响应值进行硬编码。有人知道“正确的” NS...Button常量吗?

最佳答案

此通话“安全”,但仅限10.9+。这是来自头文件:

#if NS_BLOCKS_AVAILABLE
- (void)beginSheetModalForWindow:(NSWindow *)sheetWindow completionHandler:(void (^)(NSModalResponse returnCode))handler NS_AVAILABLE_MAC(10_9);
#endif


看来他们只是不小心将其排除在了当前文档之外。但是,标头通常被视为可可中的“真相”,它们权威性地告诉您不推荐使用的内容和新功能。 (例如,与X11不同,在X11中声明文档在实际实现或标头上是正确的。)

这些是您要在完成处理程序块中使用的常量:

/* These are additional NSModalResponse values used by NSAlert's -runModal and -beginSheetModalForWindow:completionHandler:.

   By default, NSAlert return values are position dependent, with this mapping:
       first (rightmost) button = NSAlertFirstButtonReturn
       second button = NSAlertSecondButtonReturn
       third button = NSAlertThirdButtonReturn
       buttonPosition 3+x = NSAlertThirdButtonReturn + x

   Note that these return values do not apply to an NSAlert created via +alertWithMessageText:defaultButton:alternateButton:otherButton:informativeTextWithFormat:, which instead uses the same return values as NSRunAlertPanel.  See NSAlertDefaultReturn, etc. in NSPanel.h
*/
enum {
    NSAlertFirstButtonReturn    = 1000,
    NSAlertSecondButtonReturn   = 1001,
    NSAlertThirdButtonReturn    = 1002
};

08-26 23:00