Xcode XIBs中的NSSplitViewController/NSSplitViewItem支持

Xcode XIBs中的NSSplitViewController/NSSplitViewItem支持,xcode,macos,cocoa,xib,nssplitviewcontroller,Xcode,Macos,Cocoa,Xib,Nssplitviewcontroller,是否支持用于XIBs的NSSplitViewController/NSSplitViewItem?我只看到一个单独的视图 我可以拖放NSViewController并将其子类化为NSSplitViewController吗?如何添加NSSplitViewItem,它通常是开箱即用的 我很容易在故事板中看到对它们的支持 拆分视图控制器不是xib文件对象库的一部分。使用拆分视图控制器的最简单方法是使用故事板 如果不愿意使用故事板,最好的选择是创建NSSplitViewController的子类,并

是否支持用于XIBs的NSSplitViewController/NSSplitViewItem?我只看到一个单独的视图

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

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


拆分视图控制器不是xib文件对象库的一部分。使用拆分视图控制器的最简单方法是使用故事板

如果不愿意使用故事板,最好的选择是创建NSSplitViewController的子类,并选中复选框以创建xib文件

将拆分视图添加到拆分视图控制器xib文件。编写代码以加载xib文件以设置拆分视图控制器

更新


有关加载xib文件的信息,请参阅NSNib类参考。xib文件的文件所有者是NSSplitViewController子类。您可以使用该信息设置分割视图控制器。最坏的情况是,您必须编写代码从xib文件加载拆分视图,将拆分视图控制器的拆分视图设置为您加载的拆分视图,并将拆分视图项添加到拆分视图控制器。有关更多信息,请参阅NSSplitViewController类参考。

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

首先添加
NSSplitViewItem
的自定义子类,并将
viewController
属性公开为IBOutlet。编译器将抛出一个警告,所以不要忘记将属性标记为动态

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

@implementation MySplitViewItem
@dynamic viewController;
@end
在XIB中添加3个NSViewController对象。其中一个更改为自定义类NSSplitViewController。需要注意的是,不应添加
NSSplitView
。将
NSViewControllers
连接到它的
视图
。还添加2个对象并添加自定义类
MySplitViewItem
,该类公开了
viewController
,并将其连接起来

最后一步。在加载视图之前,设置
NSSplitViewController
的属性
splitItems
非常重要!否则,您将被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];
}
这是一个证明,一切都是正确的接线。请注意,我没有在XIB中触摸代理,它是有线的。魔法,我知道。

PS:XIB必须设置为更喜欢编码器+自动布局

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

我还尝试在
viewDidLoad
setView
awakeFromNib
中添加
splitViewItems
:在
NSSplitViewController
的自定义子类中(具有公开的NSSplitViewItem属性)。如果有人能在这里找到解决办法,我们将不胜感激

只需要代码的解决方案:

- (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;
}

谢谢因此,对于XIB,我必须手动(在代码中)添加NSSplitViewItems并将其粘合在一起。对吗?根据NSSplitViewController类参考,可以设置分割视图控制器的分割视图。从xib文件加载分割视图,并将分割视图控制器的分割视图设置为从xib加载的分割视图。注释非常模糊。有没有办法用XIB编写0个代码(最多10行)并获得与情节提要相同的结果?您遗漏了NSSPlivViewItem谢谢您的时间。但是,您再次忽略了NSSplitViewItem。所有这些都必须在代码中手动完成。它抛出异常。不确定这是否应该被接受。