为什么我的窗口:willPositionSheet:usingRect:委托方法没有被调用?

时间:2014-07-24 19:52:43

标签: macos cocoa

我需要重新定位NSAlert窗口。我已经发现,要做到这一点,我需要在委托中实现(NSRect)window:(NSWindow *)window willPositionSheet:(NSWindow *)sheet usingRect:(NSRect)rect方法。

我触发警报窗口的代码在以下方法中:

- (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame {
    NSAlert* jsAlert = [[NSAlert alloc] init];
    [jsAlert addButtonWithTitle:@"OK"];
    [jsAlert setMessageText:@""];
    [jsAlert setInformativeText:message];
    [jsAlert setAlertStyle:NSWarningAlertStyle];
    // [jsAlert setDelegate:self];

    [jsAlert beginSheetModalForWindow:sender.window modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:NULL];
}

我设置了modalDelegate所以self,其中selfAppDelegate。我在AppDelegate

中实现了以下方法
- (NSRect)window:(NSWindow *)window willPositionSheet:(NSWindow *)sheet usingRect:(NSRect)rect {
    NSLog(@"we are here: %s", __func__);
    return NSMakeRect(0, 0, 100, 100); // just fake
}

不会调用此方法。从我在文档中找到的内容来看,这应该可行,但我无法理解为什么它不会。

我还尝试了以下方法,即在第一个代码段中的未注释行中进行注释时,使AppDelegate符合NSWindowDelegate - 协议(以及NSAlertDelegate协议。)

@interface AppDelegate : NSObject <NSApplicationDelegate, NSAlertDelegate, NSWindowDelegate>

我到处都读到这应该有效。我在这做错了什么?

1 个答案:

答案 0 :(得分:2)

唯一要做的就是将AppDelegate实际注册为NSWindowDelegate,如下所示:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // [...]
    [self.window setDelegate:self];
    // [...]
}

这听起来非常微不足道,但是我需要花费大量时间才能找到它,因为我看到的所有例子都没有这样做。他们只是将modalDelegate设置为self,在我的情况下应该是AppDelegate

我希望这可以帮助那些人...