gpt4 book ai didi

objective-c - 我如何使用 [NSAlert beginSheetModalForWindow :completionhandler:] on older versions of OS X

转载 作者:太空狗 更新时间:2023-10-30 03:59:25 24 4
gpt4 key购买 nike

OS X Mavericks 实现了一个新的 API,以便更方便地显示 NSAlert:

- (void)beginSheetModalForWindow:(NSWindow *)sheetWindow completionHandler:(void (^)(NSModalResponse returnCode))handler

有没有一种简单的方法可以在一个类别中创建一个类似的方法来做同样的事情但在 OS X 10.8 和更早版本上受支持?

最佳答案

是的,您可以使用基于委托(delegate)的 API 模拟类似的 API。唯一棘手的部分是让所有 Actor 都正确,以便它适用于 ARC。这是 NSAlert 上的一个类别,它提供了一个向后兼容的基于 block 的 API:

NSAlert+BlockMethods.h

#import <Cocoa/Cocoa.h>
@interface NSAlert (BlockMethods)
-(void)compatibleBeginSheetModalForWindow: (NSWindow *)sheetWindow
completionHandler: (void (^)(NSInteger returnCode))handler;
@end

NSAlert+BlockMethods.m

#import "NSAlert+BlockMethods.h"
@implementation NSAlert (BlockMethods)

-(void)compatibleBeginSheetModalForWindow: (NSWindow *)sheetWindow
completionHandler: (void (^)(NSInteger returnCode))handler
{
[self beginSheetModalForWindow: sheetWindow
modalDelegate: self
didEndSelector: @selector(blockBasedAlertDidEnd:returnCode:contextInfo:)
contextInfo: (__bridge_retained void*)[handler copy] ];
}

-(void)blockBasedAlertDidEnd: (NSAlert *)alert
returnCode: (NSInteger)returnCode
contextInfo: (void *)contextInfo
{
void(^handler)(NSInteger) = (__bridge_transfer void(^)(NSInteger)) contextInfo;
if (handler) handler(returnCode);
}

@end

有关详细信息,请参阅我的 NSAlertBlockMethods Github repo .

关于objective-c - 我如何使用 [NSAlert beginSheetModalForWindow :completionhandler:] on older versions of OS X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20146249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com