NSBundle加载NSViewController

3

我正在研究一个项目,该项目将上传包含NSViewController的自定义NSBundles。在我的主程序中,我有以下代码来处理加载后的bundle...

id principalClass = [loadedBundle principalClass];
id instance = [[principalClass alloc] init];
[localLabel setStringValue:[instance name]];
NSView *incomingView = [[instance viewController] view];
[localView addSubview:incomingView];
[localView display];

而bundle中主要类的初始化方法如下所示...

-(id) init {
    if(self = [super init]){
        name = @"My Plugin";
        viewController = [[ViewController alloc] initWithNibName:@"View" bundle:nil];
    }
    return self;
}

View.nib是位于bundles项目中的nib文件。但是每当我加载bundle时,就会出现以下错误...

2010-05-27 09:11:18.423 PluginLoader[45032:a0f] unable to find nib named: View in bundle path: (null) 2010-05-27 09:11:18.424 PluginLoader[45032:a0f] -[NSViewController loadView] could not load the "View" nib.

我知道我已经将所有东西连接起来,因为[label setStringValue:[instance name]];这行代码可以正确地设置标签文本。此外,如果我将bundle中的所有类加载到我的主应用程序项目中,一切都按预期工作。有什么想法可以让我正确地引用bundle中的“View”?

谢谢!

2个回答

2
init方法中,你不应该将nil传递给bundle参数。根据UIViewController文档的说明,传递nil会在主bundle(应用程序的bundle)中查找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];

[loadedBundle principalClass] 返回的类型是 Class,而不是 id。出于可读性的原因,我可能会在 principalClass 变量中使用 Class 类型。 - dreamlax

0
"View.xib是一个nib文件"?它要么是xib文件,要么是nib文件。xib文件不是nib文件。xib文件只能在界面构建器中使用,在部署应用程序中,它们必须转换为nib文件。这就是ibtool所做的。Xcode不仅仅是复制您的xib文件,而是通过ibtool运行它们,将它们转换为nib文件,然后将它们放置到资源文件夹中。

2
一个xib是一个nib,只是以XML格式存在。Interface Builder可以使用xibs或nibs,但是xibs对于开发来说更方便,因为它们与SCM工具的兼容性更好。 - dreamlax
1
你把nib/xib文件格式和nib文件混淆了。请参考此文档。xib文件格式仍然代表一个nib文件。nib文件有两种格式,即xib和nib。在引入xib之前(仅为更好的SCM支持),nib文件只有一种格式,即nib文件格式。从链接中可以看到:“xib文件格式表示nib文件对象图的扁平存档。” - dreamlax
2
@Mecki:请阅读整个文档:“Interface Builder文档是扩展名为.nib或.xib的文件。这些文档通常被称为nib文件。”该扩展名代表了nib文件[对象图]的基本表示形式。 - dreamlax
但是,Nib文件可以在运行时加载,而Xib文件则不行。它们可能描述相同的内容,但它们不是同一种类型的文件,否则它们都可以在运行时加载。如果有人说他无法在运行时加载文件,并且同时谈论Xib文件,那么我必须认为这个用户真正指的是Xib文件,而这个文件无法在运行时加载 - Mecki
没有编程方式可以加载XIB文件...因为一旦编译...任何您已经捆绑、引用或制作的XIB文件都将自动转换为NIB,所以这个论点是愚蠢的。它们代表相同的“东西”,但只有一个NIB存在于野外。因此,没有XIB等效于loadNibNamed等方法。 - Alex Gray
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接