我有一个运行良好的基于​​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/

10-14 21:37