是否支持 XIB 的 NSSplitViewController/NSSplitViewItem?我只看到 NSSplitView
我可以拖放 NSViewController 并将其子类为 NSSplitViewController 吗?如何添加大部分开箱即用的 NSSplitViewItem?
我可以很容易地在故事板中看到对它们的支持。
是否支持 XIB 的 NSSplitViewController/NSSplitViewItem?我只看到 NSSplitView
我可以拖放 NSViewController 并将其子类为 NSSplitViewController 吗?如何添加大部分开箱即用的 NSSplitViewItem?
我可以很容易地在故事板中看到对它们的支持。
拆分视图控制器不是 xib 文件的对象库的一部分。使用拆分视图控制器的最简单方法是使用情节提要。
如果您不愿意使用情节提要,最好的选择是创建 NSSplitViewController 的子类并选中复选框以创建 xib 文件。
将拆分视图添加到拆分视图控制器 xib 文件。编写代码以加载 xib 文件以设置拆分视图控制器。
更新
查看 NSNib 类参考以获取有关加载 xib 文件的信息。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
到它的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 属性)的自定义子类中添加viewDidLoad
或setView
或:。如果有人在这里找到解决方案,将不胜感激。awakeFromNib
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;
}