Mar*_*k H 5 macos xcode cocoa xib nssplitviewcontroller
XIB 是否支持 NSSplitViewController/NSSplitViewItem?我只看到 NSSplitView
我可以拖放 NSViewController 并将其子类化为 NSSplitViewController 吗?如何添加 NSSplitViewItem 它主要是开箱即用的?
我可以很容易地在故事板中看到对它们的支持。
是的,这是可能的。但它需要一些接线。
首先添加 IBOutlet 的自定义子类NSSplitViewItem并将viewController属性公开为 IBOutlet。编译器会发出警告,因此不要忘记将属性标记为动态。
@interface MySplitViewItem : NSSplitViewItem
@property IBOutlet NSViewController *viewController;
@end
@implementation MySplitViewItem
@dynamic viewController;
@end
Run Code Online (Sandbox Code Playgroud)
在您的 XIB 中添加 3 个 NSViewController 对象。其中之一更改为自定义类 NSSplitViewController。值得注意的是,不应添加NSSplitView. 连线NSViewControllers到它的views. 还添加 2 个对象并添加MySplitViewItem已公开的自定义类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];
}
Run Code Online (Sandbox Code Playgroud)
这是所有接线正确的证明。请注意,我没有接触 XIB 中的委托,它是有线的。魔法,我知道。

PS:XIB 必须设置为首选 Coder + 自动布局。
为什么我更喜欢XIB?因为我们可以创建更大的 XIB,而不受数据隔离的影响(可以轻松地跨 NSViewController 进行绑定)。
我还尝试在 的自定义子类中添加 or 或 : splitViewItems(viewDidLoad具有setView公开的 NSSplitViewItem 属性)。如果有人在这里找到解决方案,我们将不胜感激。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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1039 次 |
| 最近记录: |