3

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

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

XIB 中的拆分视图控制器

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

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

4

2 回答 2

1

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

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

在此处输入图像描述

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

更新

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

于 2019-02-26T19:35:31.147 回答
1

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

结果

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

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

@implementation MySplitViewItem
@dynamic viewController;
@end

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

西博

最后一步。在加载视图之前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 中的代表,它是有线的。魔术,我知道。 结果

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

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

我还尝试splitViewItems在(具有暴露的 NSSplitViewItem 属性)的自定义子类中添加viewDidLoadsetView或:。如果有人在这里找到解决方案,将不胜感激。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;
}
于 2019-02-27T13:47:52.963 回答