从可可中的xib加载视图

时间:2017-05-20 22:42:31

标签: objective-c macos cocoa view xib

我试图从我的cocoa应用程序中的xib文件加载视图(我使用故事板)。

所以,我有 FirstView.xib 和storyboard的ViewController中的一些名为" _contentView "的自定义视图。我做了以下事情:

NSArray *nibObjects;
[[NSBundle mainBundle] loadNibNamed:@"FirstView" owner:self topLevelObjects:&nibObjects];
[_contentView addSubview: nibObjects[1]];

..它有效,但有时我会收到以下错误:

-[NSApplication window]: unrecognized selector sent to instance 0xXXXXXXXXXXXX
Failed to set (contentViewController) user defined inspected property on (NSWindow): -[NSApplication window]: unrecognized selector sent to instance 0xXXXXXXXXXXXX

我做错了什么,如何解决?

2 个答案:

答案 0 :(得分:1)

不要看nibObjects数组。该数组仅用于保留笔尖中的所有顶级对象。即所以你可以释放它让它们全部消失。

相反,在您的类中定义一个插座(您作为所有者传递的对象的类)并将其连接到所需的视图。然后你可以加载笔尖并使用插座中的视图。这就是网点所针对的。

更新:如果您有一个完整的列表或想要以其他方式加载同一个XIB的多个副本,请创建例如每个XIB都有一个单独的MYListItemViewController,并且 进行加载,然后让你当前的控制器创建MYListItemViewControllers并保留一个数组,而不是直接加载它们。

这是XIB如何设计工作的。在同一个所有者上加载多个XIB并不是一个好主意,你会得到多个awakeFromNib消息,而且没有人期望它,所以有人可能会添加一个插座然后被每个负载覆盖

答案 1 :(得分:0)

所以,感谢@Willeke。解决方案是:

NSArray *nibObjects = [[NSArray alloc] init];
[[NSBundle bundleForClass:[self class]] loadNibNamed:subViewName owner:self topLevelObjects:&nibObjects];
    if ([nibObjects[1] isKindOfClass:[NSView class]]){
        [_customView setSubviews:[NSArray array]];
        [_customView addSubview: nibObjects[1]];
    }
    else {
        [_customView setSubviews:[NSArray array]];
        [_customView addSubview: nibObjects[0]];
    }