我在nib文件“MyNib”中创建了一个视图“MyView” 我的问题是如何使用视图名称
创建NSView对象我的WindowController有一个自定义类。使用Interface Builder我无法在mywindowController类中创建插座。
因此,如果无法使用界面构建器创建插座,那么创建NSVIew的另一种方法是什么。
提前致谢
答案 0 :(得分:1)
您是否阅读过documentation?加载nibs / xib时,必须指定文件所有者(xib中的顶级对象)。这意味着您传递的任何对象,因为所有者必须拥有所需的出口。
BOOL success = [NSBundle loadNibNamed:@"MyNib" owner:selfOrSomeControllerWithOutlets];
这是加载xib内容并将其连接到指定所有者的最简单方法。
您还可以创建控制器实例并一次加载其xib。例如,视图/视图控制器可能由主窗口控制器加载。在窗口控制器内部,您可能有一个-widgetView(它在WidgetView.xib中加载一个视图)方法,它执行此操作:
- (NSView *)widgetView
{
if (!_widgetViewController)
_widgetViewController = [[MyWidgetViewController alloc] initWithNibName:@"WidgetView" bundle:nil];
return [_widgetViewController view];
}
在这种情况下,MyWidgetViewController是一个NSViewController子类(它给它一个-view属性,它链接到xib中的一些顶级视图。在xib中,File的Owner的类名设置为MyWidgetViewController,它的视图出口是连接到主容器视图。当使用xib成功初始化控制器时,-view出口(以及您的子类具有的任何其他插件)将重新连接,现在该控制器已连接到xib内容。
现在,第一次请求-widgetView时,它会加载xib并将视图移回视图(或nil)。每个后续调用都将只返回已加载的视图。这称为“延迟加载”,通常是不常用的视图的最佳方式。您也可以为多个“副本”执行此操作。只需在创建容器时将每个视图控制器添加到某个容器,然后根据需要进行管理。
当然上面的代码忽略了xib无法定位的可能性(在这种情况下-initWithNibName:bundle:将返回nil),你不应该这样做。绝对使用NSAssert ...()处理错误并优雅地终止(因为如果找不到xib,应用程序包可能出错)。