XIB中的NSSplitViewController / NSSplitViewItem支持

时间:2019-02-25 16:46:33

标签: xcode macos cocoa xib nssplitviewcontroller

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

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

Split View Controller in XIB

我很容易在情节提要中看到对它们的支持。

Split View Controller in Storyboard

2 个答案:

答案 0 :(得分:1)

拆分视图控制器不是xib文件的对象库的一部分。使用拆分视图控制器的最简单方法是使用情节提要。

如果您不愿意使用情节提要,最好的选择是创建NSSplitViewController的子类,然后选中该复选框以创建一个xib文件。

enter image description here

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

更新

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

答案 1 :(得分:0)

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

Result

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

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

@implementation MySplitViewItem
@dynamic viewController;
@end

在XIB中添加3个NSViewController对象。其中之一更改为自定义类NSSplitViewController。重要的是要注意,不应添加NSSplitView。将NSViewControllers连接到views。还要添加2个对象,并添加MySplitViewItem的自定义类,该类公开了viewController并对其进行接线。

XIB

最后一步。在加载视图之前,设置splitItems的属性NSSplitViewController很重要!否则,您会被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中的委托,它已连接。魔术,我知道。 Result

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

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

我还尝试过在splitViewItems的自定义子类(具有公开的NSSplitViewItem属性)的viewDidLoadsetViewawakeFromNib中添加NSSplitViewController。如果有人在这里找到解决方案,将不胜感激。

仅需要代码的解决方案:

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