我被困住了!
我正在尝试创建一个自定义模式对话框。我希望它使用块作为完成处理程序来执行类似于 NSSavePanel 的操作。
我只复制了我认为需要的重要片段。
@implementation ModalWindowController
- (void)makeKeyAndOrderFront:(id)sender
modalToWindow:(NSWindow*)window
sourceRect:(NSRect)rect
completionHandler:(void (^)(NSInteger result))handler {
_handler = [handler retain];
session = [NSApp beginModalSessionForWindow:[self window]];
[[NSApplication sharedApplication] runModalSession:session];
[[self window] makeKeyAndOrderFrontCentered:self expandingFromFrame:rect];
}
- (IBAction)okButtonPressed:(id)sender {
[[self window] orderOut:self];
_handler(NSOKButton);
[NSApp endModalSession:session];
}
@end
现在我可以使用以下代码调用它:
[self.modalWindowController makeKeyAndOrderFront:self
modalToWindow:[[self view] window]
sourceRect:sr
completionHandler:^(NSInteger result) {
NSLog(@"Inside Block");
if ( result == NSOKButton ) {
// do something interesting here
}
}];
NSLog(@"Errg");
然而一切顺利,在方法 makeKeyAndOrderFront:modalToWindow:sourceRect:completionHandler: 完成后它不会阻塞线程,因此即使用户没有选择“ok”或“cancel”也会打印“Errg”。此时会显示模态窗口,用户单击“确定”,然后执行 _handler 块。但是,如果我试图访问块中的局部变量,并且应用程序崩溃,因为一切都已经清理完毕。
从 makeKeyAndOrderFront:... 方法阻塞主线程的最佳方法是什么?这是使用块实现完成处理程序的正确方法吗?