iOS – 从Documents目录中的bundle加载xib

我一直致力于为我的iOS应用程序提供“自定义skinnable”接口,方法是捆绑xib并下载bundle,并在这些bundle中加载xib。

我已经按照这里非常有用的说明来使它几乎正常工作。

在iOS上加载NSBundle文件

我有捆绑下载,并解压缩,可以看到xib文件。 我没有在示例中使用任何TestViewController代码,但是在使用刚刚下载的xib创建视图控制器时这样做:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"gg.bundle"]; NSBundle *bundle = [NSBundle bundleWithPath:filePath]; if ( !bundle ) { NSLog(@"Error getting bundle"); } MyViewController *vc = [MyViewController new]; [vc initWithNibName:@"CustomDownloadedXib" bundle:bundle]; 

当我将此视图控制器推送到我的堆栈时,我收到此错误:

***由于未捕获的exception’NSInternalInconsistencyException’而终止应用程序,原因:’无法在bundle中加载NIB:’NSBundle(尚未加载)’,名称为’CustomDownloadedXib”

问题似乎是我的包“尚未加载”。 我尝试通过调用强制我的包加载:

 [bundle load] 

但这没有用。

我的方法不正确吗? 这似乎是直观的方式。

提前致谢!

首先,如果没有正确创建一个bundle,它将不会被加载。 因此,为了创建一个合适的包,下面是创建一个包的步骤:

  1. 通过在OS X – > Framework&Libraries下选择名为bundle的模板来添加新目标。

  2. 选择新创建的目标并将BaseSDK从OSX更改为最新iOS。

  3. 在Build Phrases – > Copy Bundle Resources中添加要从bundle中使用它的.xibs,图像或其他资源。

  4. 在Build Phrases中添加CoreFoundation框架 – >将二进制文件与Libraries链接。

  5. 编译选择iOS设备的目标。

  6. 将新创建的捆绑包从Products目录保存到某个位置。

现在将该包复制到您的主项目中。 使用以下代码加载包:

 NSString *path = [[NSBundle mainBundle] pathForResource:@"BundleName" ofType:@"bundle"]; NSBundle *bundle = [NSBundle bundleWithPath:path];" 

您现在使用新捆绑包进行设置。

按照这里的说明工作:

在iOS上加载NSBundle文件

我只是错误地创建了包!

您需要在Xcode中创建捆绑包,因为如果不这样做,它将不会被加载。 要创建“向项目添加新目标”,请选择“框架和库” – >“捆绑”,然后链接到Core Foundation。 然后将要上载的xib添加到目标网站。 构建目标,在Finder中显示它,压缩并上传!

资源编程指南摘录:

在UIKit中,应用程序只能从其主包中加载nib文件。

听起来你不能做你想做的事。 或者至少,Apple不希望你这样做。 当然,您可以随时下载带有图像的.bundle并将其加载为UIImage或类似物,然后将“活动”皮肤保存到已知目录中,该目录是您的应用程序始终查找显示界面时要使用的图像的目录。 更改皮肤等同于将该路径中的图像资源替换为下载的包中的图像资源。

经过一段时间后,我发现这是通过库加载资源的常见问题。 我错过了添加“CoreFramework”链接到资源包的步骤,也没有将其复制到客户端应用程序文件夹。 这些步骤将有助于适当地加载资源包。 #dsiddhapura的提示帮助我找出了这些问题。