【问题标题】:How do I use InterfaceBuilder files in Xcode subprojects?如何在 Xcode 子项目中使用 InterfaceBuilder 文件?
【发布时间】:2010-10-04 20:07:21
【问题描述】:

我正在开发一个 iPhone 应用程序,它是另一个启动器的“模块”(它不会从 iPhone 主屏幕启动)。要将此模块添加到启动器,我必须将 xcode 文件放入父 xcode 项目(创建子项目)。子项目使用 NIB 文件作为其视图控制器,子项目使用 initWithNib 加载文件:

root_view_controller = [[UINavigationController alloc] initWithRootViewController:[[LMU_IP_RootView alloc] initWithNibName:@"LMU_IP_RootView" bundle:nil]];

当我尝试运行父项目时,它崩溃了:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle [...] (loaded)' with name 'LMU_IP_RootView''

我猜是因为它找不到 NIB 文件,因为根包现在是父项目而不是子项目。我可以在父项目中包含 NIB 并修复错误,但不能解决我的问题。

所以我的问题是:如何在子项目中使用 InterfaceBuilder 文件?我必须指定一个捆绑包吗?如何指定引用此子项目的捆绑包?

谢谢!

【问题讨论】:

  • 谁能帮忙?我需要澄清或发布示例文件吗?

标签: iphone objective-c interface-builder


【解决方案1】:

当 bundle 为 nil 时,搜索是在 main bundle 中执行的,而不是在您的子项目 bundle 中。我对您的应用架构并不完全清楚,但请尝试将包含该类的包指定为要搜索的包:

NSBundle *classBundle = [NSBundle bundleForClass:[LMU_IP_RootView class]];
id vc = [[LMU_IP_RootView alloc] initWithNibName:nil bundle:classBundle]
root_view_controller = [[UINavigationController alloc]
                        initWithRootViewController:vc];
[vc release];

请注意,nil nib 名称默认为“ClassName.nib”,因此在这种情况下将搜索 LMU_IP_RootView.nib

通常最好在视图控制器类中覆盖-init,以便它执行正确的查找。这样客户端代码就不必担心类需要什么 nib。

【讨论】:

  • 哈,这个问题有点老了,但我很感激你的回答。原来我只是很密集:我的“子项目”实际上是一个静态库,所以当它说它找不到资源时......那是因为它们不在那里。一旦我意识到我的错误,我只需将接口构建器文件包含在引用静态库的应用程序中,一切都恢复正常了。
猜你喜欢
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
相关资源
最近更新 更多