首先让我说我是一个非常原始的 iPhone 开发者。
我正在制作一个可用于 iPhone 应用程序的静态库。它需要显示一个 View ,但据我所知,静态库不能包含 nib(或 xib,在我的例子中)。所以,我创建了一个单独的包,其中包含我需要的 xib。然后,我将 bundle 与应用程序中的静态库一起包含在内。我想使用有问题的 xib 初始化一个扩展 UIViewController
的类。
我的库中有以下代码:
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Mobtest" ofType:@"bundle"];
NSBundle *mobtestBundle = [NSBundle bundleWithPath:bundlePath];
NSLog([@"bundle path: " stringByAppendingString: [[NSBundle bundleWithPath:bundlePath] bundlePath]]);
sharedInstance = [[MTFeedbackViewController alloc] initWithNibName:@"MTFeedbackViewController" bundle:mobtestBundle];
NSLog
输出的包路径是已编译应用程序中包的正确路径。不幸的是,我无法初始化 UIViewController
而是出现以下错误:
2010-08-20 22:08:16.102 MobtestLibSampleApp[2332:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] was unable to load a nib named "MTFeedbackViewController"'
有没有人对为什么无法加载 xib 有任何建议?也许其中的某些内容链接不正确?有什么地方可以获得额外的调试信息吗?
最佳答案
您是否考虑过放弃 nib 并通过在 View Controller 中实现 -loadView 来在代码中构建 View ?如果您没有很多 View ,和/或它们并不复杂,那么这对于您的库的用户来说会更容易,因为他们不必担心将一个包与您的库一起包含。
出于调试目的,您可以在 View Controller 中覆盖 -loadView 并检查 self.nibName 和 self.nibBundle 以确保您的 Controller 正在获取您传入的资源。请记住调用 [super loadView]这样你的 Nib 就真的被加载了。 (请注意,如果您重写 loadView 来构建 View ,并设置 Controller 的 View 属性,则您不应调用 [super loadView]。)
文档说你的 bundle 中的 nib 应该位于“lang specific project dir”或“Resources”子目录中。在 Xcode 中仔细检查您的 bundle 目标,以确保您的 nib 被复制到您的 bundle 中的正确位置('Projects' 或 'Resources' 子目录)。另外,尝试在 loadView 方法中检查包的内容:
NSLog(@"nib path inside bundle: %@", [self.nibBundle pathForResource:@"MTFeedbackViewController" ofType:@"nib"]);
关于iphone - 为什么我不能在我的 iPhone 静态库中的包中加载 nib?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3536427/