2010-05-27 47 views
3

我正在研究一个项目,该项目将上传包含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]];正确设置标签文本。另外,如果我将捆绑中的所有分支并将它们加载到我的主应用程序项目中,那么所有功能都可以按预期运行。有关我如何正确引用我的包中的“视图”的任何想法?

谢谢!

回答

2

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]; 
+0

'''''''''''''''''''''''''''出于可读性的原因,我可能会对'principalClass'变量使用'Class'类型。 – dreamlax 2010-05-27 14:49:32

+0

就在头上。在20分钟内!谢啦 – Staros 2010-05-27 14:52:13

0

“View.xib是一个笔尖”?要么它是一个xib或它是一个笔尖。 xib不是笔尖。 xib文件只能在界面构建器中使用,在部署应用程序中,它们必须转换为nib文件。这就是ibtool正在做的事情。 Xcode不会简单地复制您的xib文件,而是通过ibtool运行它们,将它们转换为nib文件,然后将它们放入Resources文件夹中。

+2

一个厦门国际银行是一个笔尖,只需在XML格式。接口构建器可以使用xib或者nib,但是xibs更便于开发,因为它们可以更好地与SCM工具配合使用。 – dreamlax 2010-05-27 14:42:48

+0

@dreamlax:Apple的文档非常清晰,xib文件不打算部署。即使创建调试版本,您也应该在复制阶段将xib转换为nib文件。 Apple不保证每个可以处理nib文件的方法/函数都可以同样处理xib文件。考虑xib文件(如PDF文件(矢量图形,文本和位图)和nib文件,如PNG文件(仅限位图))。并非所有可以处理PNG图像的图像功能都可以处理PDF文档。 – Mecki 2010-05-27 16:18:45

+1

您正在将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

相关问题