我需要重新定位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
,其中self
是AppDelegate
。我在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>
我到处都读到这应该有效。我在这做错了什么?
答案 0 :(得分:2)
唯一要做的就是将AppDelegate
实际注册为NSWindowDelegate
,如下所示:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// [...]
[self.window setDelegate:self];
// [...]
}
这听起来非常微不足道,但是我需要花费大量时间才能找到它,因为我看到的所有例子都没有这样做。他们只是将modalDelegate
设置为self
,在我的情况下应该是AppDelegate
。
我希望这可以帮助那些人...