通过反复试验,我想出了以下解决方案。
这需要一个NSDocument
子类,我们称之为“CustomDocument”。
在其中,我添加了一个标志来控制是否要将新窗口添加为选项卡:
@interface CustomDocument : NSDocument
@property BOOL foceIntoTab;
@end
然后我需要实现一个自定义处理程序来创建窗口控制器,我首先确定是否已经有一个窗口可以添加另一个,然后创建新控制器,最后将其添加为选项卡:
- (void)makeWindowControllers // override
{
__block NSWindow *frontWindow = nil;
if (self.forceIntoTab) {
// Find the topmost window that's of my document type
[NSApp enumerateWindowsWithOptions:NSWindowListOrderedFrontToBack usingBlock:^(NSWindow *window, BOOL *stop) {
if ([window.windowController.document isKindOfClass:CustomDocument.class]) {
frontWindow = window;
*stop = YES;
}
}];
}
NSWindowController *windowController = [[NSStoryboard storyboardWithName:@"Main" bundle:nil] instantiateControllerWithIdentifier:@"Custom Controller"];
if (frontWindow) {
[frontWindow.tabGroup addWindow:windowController.window];
[windowController.window orderFront:frontWindow];
[windowController.window makeKeyWindow];
}
NSViewController *viewController = windowController.contentViewController;
[viewController setRepresentedObject:self];
[self addWindowController:windowController];
}
剩下的就是forceIntoTab
通过菜单栏创建新窗口时的设置。例如,我可以在我的自定义 DocumentController 类中执行此操作:
- (nullable __kindof NSDocument *)makeUntitledDocumentOfType:(NSString *)typeName error:(NSError **)outError // override
{
CustomDocument *doc = [super makeUntitledDocumentOfType:typeName error:outError];
doc.forceIntoTab = YES;
return doc;
}