ОК, 5 лет спустя, я могу сделать эту работу - хитрость заключается в том, чтобы открыть второе окно, продвинуть его в CGShieldingWindowLevel, сделать его ключом и упорядочить фронт, затем прикрепить к нему открытый лист - лист волшебным образом появляется там, где находится второе окно, и хотя оно и не идеально, оно выглядит намного лучше, чем решение, которое я придумал изначально. Вот изменение:
NSOpenPanel *OP = [NSOpenPanel openPanel];
// this is the new bit - make the window 1x1 @ the location of your liking
NSRect windowRect = NSMakeRect(0, 1000, 1, 1);
NSWindow *OPW = [[NSWindow alloc] initWithContentRect:windowRect
styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered
defer:NO];
int windowLevel = CGShieldingWindowLevel();
[OPW setLevel:windowLevel];
[OPW makeKeyAndOrderFront:nil];
// end of new bit, apart from passing OPW for beginSheetModalForWindow
// instead of [self window]
[OP beginSheetModalForWindow:OPW
completionHandler:^(NSInteger returnCode) {
NSLog(@"completionHandler called with %d", returnCode);
}];
... единственная мысль, на которую следует обратить внимание, это то, что с помощью приведенного ниже вы можете открыть несколько открытых диалогов, так как лист является модальным для окна, отличного от главного окна - главное окно все еще может принимать щелчок мыши события ...