NSBundle加载NSViewController
我正在研究一个项目,该项目将上传包含NSViewController的自定义NSBundles。在我的主程序我有了这个代码来处理同捆它加载后...NSBundle加载NSViewController
id principalClass = [loadedBundle principalClass];
id instance = [[principalClass alloc] init];
[localLabel setStringValue:[instance name]];
NSView *incomingView = [[instance viewController] view];
[localView addSubview:incomingView];
[localView display];
而被捆绑的主要类init方法看起来像这样...
-(id) init {
if(self = [super init]){
name = @"My Plugin";
viewController = [[ViewController alloc] initWithNibName:@"View" bundle:nil];
}
return self;
}
View.nib是位于捆绑项目中的一个nib。但是每当我加载捆绑我得到这个错误...
2010-05-27 09:11:18.423 PluginLoader [45032:a0f]无法找到名为:在包视图中查看nib:(空) 2010- 05-27 09:11:18.424 PluginLoader [45032:a0f] - [NSViewController loadView]无法加载“查看”笔尖。
我知道我已经连线了一切,因为行[label setStringValue:[instance name]];
正确设置标签文本。另外,如果我将捆绑中的所有分支并将它们加载到我的主应用程序项目中,那么所有功能都可以按预期运行。有关我如何正确引用我的包中的“视图”的任何想法?
谢谢!
在init
方法中,您不应将nil
传递给bundle参数。根据UIViewController文档,通过nil
将查找主包(应用程序的一个)中的NIB文件,这不是您想要的。
您可以变通,通过使用专门的初始化是这样的:
- (id) initWithBundle:(NSBundle *)bundle {
if(self = [super init]){
name = @"My Plugin";
viewController = [[ViewController alloc] initWithNibName:@"View" bundle:bundle];
}
return self;
}
并以此如下:
Class principalClass = [loadedBundle principalClass];
id instance = [[principalClass alloc] initWithBundle:loadedBundle];
“View.xib是一个笔尖”?要么它是一个xib或它是一个笔尖。 xib不是笔尖。 xib文件只能在界面构建器中使用,在部署应用程序中,它们必须转换为nib文件。这就是ibtool正在做的事情。 Xcode不会简单地复制您的xib文件,而是通过ibtool运行它们,将它们转换为nib文件,然后将它们放入Resources文件夹中。
一个厦门国际银行是一个笔尖,只需在XML格式。接口构建器可以使用xib或者nib,但是xibs更便于开发,因为它们可以更好地与SCM工具配合使用。 – dreamlax 2010-05-27 14:42:48
@dreamlax:Apple的文档非常清晰,xib文件不打算部署。即使创建调试版本,您也应该在复制阶段将xib转换为nib文件。 Apple不保证每个可以处理nib文件的方法/函数都可以同样处理xib文件。考虑xib文件(如PDF文件(矢量图形,文本和位图)和nib文件,如PNG文件(仅限位图))。并非所有可以处理PNG图像的图像功能都可以处理PDF文档。 – Mecki 2010-05-27 16:18:45
您正在将nib/xib *文件格式*与nib文件混淆。请参阅[本文档](http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/IB_UserGuide/BuildingaNibFile/BuildingaNibFile.html#//apple_ref/doc/uid/TP40005344-CH11-SW14)。 xib文件格式仍然代表一个nib文件。一个nib文件有两种格式,xib和nib。在引入xib之前(仅用于更好的SCM支持),一个nib文件具有一种格式,即nib文件格式。从链接中:“xib文件格式表示nib文件对象图的展开存档。” – dreamlax 2010-05-27 22:11:00
'''''''''''''''''''''''''''出于可读性的原因,我可能会对'principalClass'变量使用'Class'类型。 – dreamlax 2010-05-27 14:49:32
就在头上。在20分钟内!谢啦 – Staros 2010-05-27 14:52:13