2

Snow Leopardは、古いbeginSheetに代わるいくつかの方法を導入しませんでした:ブロックを使用して仕上げを行うことができる方法ですか?別のコールバックメソッドに含めるのは好きではありません。

4

1 に答える 1

5

どうでも。私はこれらの2つのサイトで探しているものを見つけました:

http://www.mikeash.com/pyblog/friday-qa-2009-08-14-practical-blocks.html、http://www.cocoabuilder.com/archive/cocoa/281058-sheets-blocks-and- _ _ガベージコレクター.html

実際、これはコードであり、GCと非GCの両方と完全に互換性があります。

@implementation NSApplication (SheetAdditions)

- (void)beginSheet:(NSWindow *)sheet modalForWindow:(NSWindow *)docWindow didEndBlock:(void (^)(NSInteger returnCode))block
{  
  [self beginSheet:sheet
    modalForWindow:docWindow
     modalDelegate:self
    didEndSelector:@selector(my_blockSheetDidEnd:returnCode:contextInfo:)
       contextInfo:Block_copy(block)];
}

- (void)my_blockSheetDidEnd:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
  void (^block)(NSInteger returnCode) = contextInfo;
  block(returnCode);
  Block_release(block);
}

@end
于 2011-01-28T15:15:53.657 に答える