首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XIB中的NSSplitViewController/NSSplitViewItem支持

XIB中的NSSplitViewController/NSSplitViewItem支持
EN

Stack Overflow用户
提问于 2019-02-25 16:46:33
回答 2查看 765关注 0票数 4

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-27 13:47:52

是的有可能。但它需要一些电线。

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

代码语言:javascript
复制
@interface MySplitViewItem : NSSplitViewItem
@property  IBOutlet NSViewController *viewController;
@end

@implementation MySplitViewItem
@dynamic viewController;
@end

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

最后一步。在加载视图之前设置属性splitItems of NSSplitViewController非常重要!否则,您将被NSAssert宏捕获。

代码语言:javascript
复制
- (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,它不受数据隔离的影响(可以轻松地跨NSViewControllers进行绑定)。

我还试验了在viewDidLoadsetViewawakeFromNib中添加NSSplitViewController:自定义子类(带有公开的NSSplitViewItem属性)。如果有人在这里找到解决办法,我们会非常感激的。

只需要代码的解决方案:

代码语言:javascript
复制
- (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;
}
票数 1
EN

Stack Overflow用户

发布于 2019-02-26 19:35:31

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

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

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

更新

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54870957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档