gpt4 book ai didi

objective-c - beginSheetModalForWindow - 警报窗口消失

转载 作者:行者123 更新时间:2023-12-03 17:23:05 24 4
gpt4 key购买 nike

AppDelegate 中实现的这段代码有什么问题?警报很快就会出现在窗口上方,然后消失。永远不会调用alertDidEnd回调方法。

我尝试在 Xcode 4.6.1 中清理产品并重建它,但没有成功。

- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
[[alert window] orderOut:self];
alertResult = returnCode;
NSLog(@"alertDidEnd called");
}

- (void) showAlert
{
NSAlert *saveAlert = [[NSAlert alloc] init];

[saveAlert setAlertStyle:NSWarningAlertStyle];
[saveAlert setMessageText:messageText];
[saveAlert setInformativeText:informativeText];
[saveAlert addButtonWithTitle:defaultButtonTitle];
[saveAlert addButtonWithTitle:secondButtonTitle];

[saveAlert beginSheetModalForWindow:[self window]
modalDelegate:self
didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
contextInfo:nil];
}

我自己回答。问题出在 applicationShouldTerminate 方法的其他地方。

- (NSApplicationTerminateReply )applicationShouldTerminate:(NSApplication *) sender
{ if(conditionOK)
doSomeStuff;
else // all changes are not saved
{ [self showAlert];
handleButtonClicked;
}

return NSTerminateNow;
}

在 if 语句的 else 分支中,执行 showAlert,但也会执行“return NSTerminateNow”。应用程序不会等到单击警报中的按钮。它立即返回。因此,我测试了尚未发布的回复。

我将修改 applicationShouldTerminate 方法。

- (NSApplicationTerminateReply )applicationShouldTerminate:(NSApplication *) sender
{ if(conditionOK)
doSomeStuff;
return NSTerminateNow;
else
{ [self showAlert];
return NSTerminateCancel;
}
}

alertDidEnd 回调方法将测试返回的按钮,完成工作并在必要时发送终止信号。

目前,我还没有解决问题,但我知道问题出在哪里。

只是一个问题:beginSheetModalForWindow 始终是异步的,还是仅在 applicationShouldTerminate 的上下文中异步?

最佳答案

这是 applicationShouldTerminate 的最终版本

- (NSApplicationTerminateReply )applicationShouldTerminate:(NSApplication *) sender
{
if([_buttonSave isEnabled])
{ if(quitMenuTerminate)
[self majFile];
else
{ [self showAlert];
return NSTerminateLater;
}
}

return NSTerminateNow;
}

在beginSheetModalForWindow的回调方法alertDidEnd中,我调用

[[NSApplication sharedApplication] replyToApplicationShouldTerminate:YES];

现在一切都OK了。

关于objective-c - beginSheetModalForWindow - 警报窗口消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15831649/

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