XIB 中的 NSSplitViewController/NSSplitViewItem 支持

Mar*_*k H 5 macos xcode cocoa xib nssplitviewcontroller

XIB 是否支持 NSSplitViewController/NSSplitViewItem?我只看到 NSSplitView

我可以拖放 NSViewController 并将其子类化为 NSSplitViewController 吗?如何添加 NSSplitViewItem 它主要是开箱即用的?

XIB 中的拆分视图控制器

我可以很容易地在故事板中看到对它们的支持。

故事板中的分割视图控制器

Mar*_*k H 1

是的,这是可能的。但它需要一些接线。

结果

首先添加 IBOutlet 的自定义子类NSSplitViewItem并将viewController属性公开为 IBOutlet。编译器会发出警告,因此不要忘记将属性标记为动态。

@interface MySplitViewItem : NSSplitViewItem
@property  IBOutlet NSViewController *viewController;
@end

@implementation MySplitViewItem
@dynamic viewController;
@end
Run Code Online (Sandbox Code Playgroud)

在您的 XIB 中添加 3 个 NSViewController 对象。其中之一更改为自定义类 NSSplitViewController。值得注意的是,不应添加NSSplitView. 连线NSViewControllers到它的views. 还添加 2 个对象并添加MySplitViewItem已公开的自定义类viewController并连接它。

厦门国际银行

最后一步。在加载视图之前设置属性非常重要splitItemsNSSplitViewController否则你就会被 NSAssert 宏捕获。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSNib *nib = [[NSNib alloc] initWithNibNamed:@"Empty" bundle:nil];
    NSMutableArray *test = [NSMutableArray new];
    NSMutableArray *splitItems = [NSMutableArray new];
    NSSplitViewController *controller;
    [nib instantiateWithOwner:self topLevelObjects:&test];
    for (id object in test) {
        if ([object isKindOfClass:[NSSplitViewController class]]) {
            controller = object;
        }
        if ([object isKindOfClass:[NSSplitViewItem class]]) {
            [splitItems addObject:object];
        }
    }
    [controller setValue:splitItems forKey:@"splitViewItems"];
    [[self window] setContentViewController:controller];
}
Run Code Online (Sandbox Code Playgroud)

这是所有接线正确的证明。请注意,我没有接触 XIB 中的委托,它是有线的。魔法,我知道。 结果

PS:XIB 必须设置为首选 Coder + 自动布局。

为什么我更喜欢XIB?因为我们可以创建更大的 XIB,而不受数据隔离的影响(可以轻松地跨 NSViewController 进行绑定)。

我还尝试在 的自定义子类中添加 or 或 : splitViewItemsviewDidLoad具有setView公开的 NSSplitViewItem 属性)。如果有人在这里找到解决方案,我们将不胜感激。awakeFromNibNSSplitViewController

只需要代码的解决方案:

- (NSSplitViewController *)profilesSVC
{
    if (!_profilesSVC) {
        NSSplitViewController *splitVC = [[NSSplitViewController alloc] init];
        ProfilesViewController *profilesVC = [[ProfilesViewController alloc] initWithNibName:@"Profiles" bundle:nil];
        NSSplitViewItem *leftItem = [NSSplitViewItem splitViewItemWithViewController:profilesVC];
        [splitVC addSplitViewItem:leftItem];
        ProfileViewController *profileVC = [[ProfileViewController alloc] initWithNibName:@"Profile" bundle:nil];
        NSSplitViewItem *rightItem = [NSSplitViewItem splitViewItemWithViewController:profileVC];
        [splitVC addSplitViewItem:rightItem];
        _profilesSVC = splitVC;
    }
    return _profilesSVC;
}
Run Code Online (Sandbox Code Playgroud)