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

时间:2011-06-24 04:44:54

标签: ios bundle

我一直致力于通过捆绑xib和下载捆绑包以及在这些捆绑包中加载xib来为我的iOS应用程序提供“自定义skinnable”界面。

我已按照这里非常有用的说明进行操作。

loading NSBundle files on iOS

我有捆绑下载,解压缩,可以看到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];

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

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

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

[bundle load]

但这没有帮助。

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

提前致谢!

4 个答案:

答案 0 :(得分:5)

首先,如果未正确创建捆绑包,则不会加载。因此,为了创建一个合适的包,下面是创建包的步骤:

  1. 通过在OS X下选择名为bundle的模板来添加新目标 - >框架&库。

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

  3. 在Build Phrases中添加要从捆绑中使用它的.xibs,图像或其他资源 - >复制捆绑资源。

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

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

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

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

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

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

答案 1 :(得分:3)

按照说明进行操作:

loading NSBundle files on iOS

我只是错误地创建了这个包!

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

答案 2 :(得分:0)

摘自Resource Programming Guide

  

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

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

答案 3 :(得分:0)

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