3

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

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 是位于 bundles 项目中的一个 nib。但是每当我加载捆绑包时,我都会收到此错误...

2010-05-27 09:11:18.423 PluginLoader [45032:a0f] 找不到名为:在捆绑路径中查看:(空)2010-05-27 09:11:18.424 PluginLoader [45032:a0f]-[NSViewController loadView ] 无法加载“视图”笔尖。

我知道我已经把所有东西都连接好了,因为该行[label setStringValue:[instance name]];正确设置了标签文本。另外,如果我将包中的所有类都加载到我的主应用程序项目中,一切都会按预期工作。关于如何在我的包中正确引用“视图”的任何想法?

谢谢!

4

2 回答 2

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];
于 2010-05-27T14:40:09.363 回答
0

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

于 2010-05-27T14:37:18.777 回答