代码之家  ›  专栏  ›  技术社区  ›  pr1001

为什么我不能在我的iPhone静态库中的包中加载nib?

  •  0
  • pr1001  · 技术社区  · 15 年前

    让我先说我是一个 非常

    UIViewController 使用有问题的xib。

    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 而是得到以下错误:

    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有什么建议吗?也许其中有些东西链接错误?有什么地方我可以得到额外的调试信息吗?

    2 回复  |  直到 10 年前
        1
  •  2
  •   Brian Chapados    15 年前

    您是否考虑过放弃nib,通过在视图控制器中实现-loadView在代码中构建视图?如果您没有太多视图,并且/或者视图并不复杂,那么对于库的用户来说,这会更容易,因为他们不必担心在lib中包含一个包。

    出于调试目的,可以在视图控制器中重写-loadView并检查self.nibName名称以及自我约束包以确保您的控制器正在获取您传递的资源。只要记住调用[super loadView],这样你的nib就可以被加载了。(请注意,如果重写loadView以生成视图,并设置控制器的view属性,则应 呼叫[super loadView]。)

    文档说包中的nib应该位于“lang-specific-project目录”或“Resources”子目录中。仔细检查Xcode中的bundle目标,确保nib被复制到bundle中的正确位置(“Projects”或“Resources”子目录)。另外,请尝试在loadView方法中检查捆绑包的内容:

    NSLog(@"nib path inside bundle: %@", [self.nibBundle pathForResource:@"MTFeedbackViewController" ofType:@"nib"]);
    
        2
  •  0
  •   tc.    15 年前

    我希望你说的是笔尖。xibs是一种XML序列化,由Interface Builder编辑;在构建过程中,它们被编译为xibs。iphonenib似乎是一个二进制plist(我认为二进制plists在10.3之前不存在,我不知道在那之前发生了什么)。

    尝试 NSLog(@"%@",[mobtestBundle pathForResource:@"MTFeedbackViewController" ofType:@"nib"])

    另请注意,NSLog的第一个参数是printf样式的格式字符串,因此如果包路径包含一个百分比,则调用未定义的行为。

    推荐文章