我有一个运行良好的基于NSDocument的应用程序-但现在我想给它一个客户NSWindowController,以便可以实现对它的NSTouchbar支持。
到目前为止,我只是使用了NSDocument提供的标准NSWindowController-所以我没有任何经验。我已经实现了一个NSWindowController的存根,我相信这已经足够了:
(document.h)
#import <Cocoa/Cocoa.h>
@interface DocumentWindowController : NSWindowController
@end
@interface Document : NSDocument
.
.
.
(document.m)
static NSTouchBarItemIdentifier WindowControllerLabelIdentifier = @"com.windowController.label";
@interface DocumentWindowController () <NSTouchBarDelegate>
@end
@implementation DocumentWindowController
- (void)windowDidLoad
{
[super windowDidLoad];
}
- (NSTouchBar *)makeTouchBar
{
NSTouchBar *bar = [[NSTouchBar alloc] init];
bar.delegate = self;
// Set the default ordering of items.
bar.defaultItemIdentifiers = @[WindowControllerLabelIdentifier, NSTouchBarItemIdentifierOtherItemsProxy];
return bar;
}
- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier
{
if ([identifier isEqualToString:WindowControllerLabelIdentifier])
{
NSTextField *theLabel = [NSTextField labelWithString:@"Test Document"];
NSCustomTouchBarItem *customItemForLabel =
[[NSCustomTouchBarItem alloc] initWithIdentifier:WindowControllerLabelIdentifier];
customItemForLabel.view = theLabel;
// We want this label to always be visible no matter how many items are in the NSTouchBar instance.
customItemForLabel.visibilityPriority = NSTouchBarItemPriorityHigh;
return customItemForLabel;
}
return nil;
}
@end
@implementation Document
.
.
.
但是现在我不知道如何连接它,以便NSDocument使用我的NSWindowController(DocumentWindowController)。我试过在xib中创建一个新对象,然后将Window连接到它-但这没用。我的DocumentWindowController方法都不起作用。我很茫然!
帮我堆栈溢出,您是我唯一的希望!
最佳答案
来自How to Subclass NSWindowController
如何子类化NSWindowController
一旦决定子类化NSWindowController,就需要更改默认的基于文档的应用程序设置。首先,将文档用户界面的所有Interface Builder出口和操作添加到NSWindowController子类中,而不是添加到NSDocument子类中。 NSWindowController子类实例应该是nib文件的文件所有者,因为这样可以更好地区分视图相关的逻辑和模型相关的逻辑。某些菜单操作仍可以在NSDocument子类中实现。例如,“保存和还原文档”由NSDocument实现,您可以添加自己的其他菜单操作,例如用于在文档上创建新视图的操作。
其次,不要覆盖NSDocument子类中的windowNibName,而应覆盖makeWindowControllers。在makeWindowControllers中,至少创建一个自定义NSWindowController子类的实例,然后使用addWindowController:将其添加到文档中。如果您的文档始终需要多个控制器,请在此处全部创建。如果文档可以支持多个视图,但默认情况下具有一个视图,请在此处为默认视图创建控制器,并提供用户操作以创建其他视图。
您不应强迫窗口在makeWindowControllers中可见。如果合适,NSDocument会为您完成此操作。
关于objective-c - 如何为NSDocument实现自定义NSWindowController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40614091/