NSInternalInconsistencyException - 无法在包中加载NIB

3

我正在尝试将所有的.xib资源捆绑到一个"ViewController.bundle"中,与"MyLibrary.framework"一起发布。如果我只是将所有的.xib文件放在框架项目中,一切都很正常,但如果我将它们放在"ViewController.bundle"中,一切都会崩溃。

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Could not load NIB in bundle: 
'NSBundle </Users/administrator/Library/Application Support/iPhone Simulator/5.0/
Applications/8AD68FD1-158E-4926-AE03-8FEF870E7012/ios.app/ViewController.bundle> 
(not yet loaded)' with name 'FirstViewController_iPhone''
*** First throw call stack:
(0x160e052 0x1071d0a 0x15b6a78 0x15b69e9 0x3ff838 0x2a6e2c 0x2a73a9 0x2a75cb 0x2c2b89 0x2c29bd  
0x2c0f8a 0x2c0d7e 0x2c0a22 0x2bfd88 0x5e3ac 0x2df8 0x2e34 0x160fec9 0x1e45c2 0x1e455a 0x289b76 
0x28a03f 0x2892fe 0x209a30 0x209c56 0x1f0384 0x1e3aa9 0x1eedfa9 0x15e21c5 0x1547022 0x154590a    
0x1544db4 0x1544ccb 0x1eec879 0x1eec93e 0x1e1a9b 0x2452 0x2385)

我尝试了几种方法: 1. 在Finder中创建“ViewController.bundle”,将所有.xib文件放在其中,然后拖到xcode中。 2. 为框架项目创建一个新的目标,在“OS X”部分的“Framework & Library”下选择“Bundle”(注意:它必须是OSX,因为我正在使用xcode 4.6,它没有在其“Framework & Library”下有“Bundle” - 它曾经有过,我曾经使用这个向导创建包含.png资源的bundle)
在这两种情况下,我确保“ViewController.bundle”存在于我的目标应用程序的“Build Phase”>>“Copy Bundle Resources”中。 我还尝试将“ViewController.bundle”包含在框架项目的“Target Dependencies”下,但是所有的努力都导致了同样的崩溃。
我也尝试了各种方式来加载.xib,但是都没有成功。然而,以下代码从同一“ViewController.bundle”加载.png资源完美地工作:
// Loading .png resource works perfectly
//  UIImage* closeImage = [UIImage imageNamed:@"ViewController.bundle/first.png"];
//  NSString *szBundlePath = [[NSBundle mainBundle] pathForResource:@"ViewController" ofType:@"Bundle"];
//  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"showView" message:szBundlePath delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil];
//  UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(220, 10, 40, 40)];
//  [imageView setImage:closeImage];
//  [alertView addSubview:imageView];
//  [alertView show];
//  return;

使用相同的代码加载xib失败:
NSBundle *bViewController = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"ViewController" withExtension:@"bundle"]];
if ( [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone ) {
    self.m_pFirstViewController = [[[FirstViewController alloc] initWithNibName:@"FirstViewController_iPhone" bundle:bViewController] autorelease];
    self.m_pSecondViewController = [[[SecondViewController alloc] initWithNibName:@"SecondViewController_iPhone" bundle:bViewController] autorelease];
} else {
    self.m_pFirstViewController = [[[FirstViewController alloc] initWithNibName:@"ViewController.bundle/FirstViewController_iPad" bundle:nil] autorelease];
    self.m_pSecondViewController = [[[SecondViewController alloc] initWithNibName:@"ViewController.bundle/SecondViewController_iPad" bundle:nil] autorelease];
}

    /** It crash in this line!! Note however, both m_pFirstViewController and m_pSecondViewController is allocated and not nil */
self.viewControllers = @[self.m_pFirstViewController, self.m_pSecondViewController];

    /** never reach here already crash */
[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentViewController:self animated:YES completion:^{
    NSLog( @"presented!" );
}];

我已经花了最近8个小时来调试这个问题,搜索并尝试了各种SO上的建议,但是都没有成功...非常感谢任何帮助!谢谢!


可能有一些控件从XIB中删除了,但它们已经与XIB映射。 - SAMIR RATHOD
不,所有的.xib都包含在内,但是我检查了.app里面的.bundle,它们都按原样包含在内。也就是说:.xib文件,但错误似乎期望编译后的版本(.nib文件)。 - Zennichimaro
1个回答

3
我尝试的第二种方法是最接近的...然后在构建设置中将OSX包修改为iOS包。显然,我错过了几个步骤。我按照Matt Galloway在这里提供的教程和示例项目进行操作:http://www.galloway.me.uk/tutorials/ios-library-with-resources/现在一切都按预期工作。
感谢大家的帮助!

谢谢!附注:如果您的PNG文件被转换为TIFF,请添加此“用户定义”构建设置: COMBINE_HIDPI_IMAGES = NO - MechEthan

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