2

所以,假设我有一个这样的方法,用于document在实际关闭它之前检查是否已被修改:

- (BOOL) canCloseDocument:(id)document
{
     if ([document modified])
     CONFIRM_ALERT(@"Close Document", 
                      @"Are you sure you want to close this document?", 
                      [[core browser] window], 
                      @selector(confirm:code:context:),
                      nil);
     else
          return YES;
}

在这种情况下,该confirm:code:context:方法将被调用并且 NOTHING 将被返回canCloseDocument

这是我的CONFIRM_ALERT定义:

#define CONFIRM_ALERT(X,Y,Z,W,V) \
NSAlert* confirmAlert = [NSAlert alertWithMessageText:X \
defaultButton:@"OK" \
alternateButton:@"Cancel" \
otherButton:nil \
informativeTextWithFormat:Y]; \
[confirmAlert beginSheetModalForWindow:Z \
modalDelegate:self \
didEndSelector:W \
contextInfo:V];

问题 :

我怎么能这样做,以便显示警报表,并在同一方法(canCloseDocument:)中检索值(按下确定?按下取消?),以便它可以返回YESNO

4

1 回答 1

1

表格是窗口模式的,而不是应用程序模式的。这意味着他们不会按照您希望的方式运作。工作表被显示,但随后执行流程必须返回到主事件循环,以便用户可以继续在应用程序的其他窗口上进行操作。

如果您想在返回之前得到答案,则必须使用模态警报。创建警报,然后调用-runModal它,而不是-beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:.

但是,这会阻止用户对您的应用程序执行任何其他操作,直到他们关闭模式警报。请注意,这不仅是模态警报所固有的,也是您在-canCloseDocument:得到答案之前不返回的愿望所固有的。这意味着执行流程不会返回到主事件循环,这是允许与您的应用程序交互的原因。

于 2012-04-06T10:28:58.113 回答