在进行资源封装的时候用到了自定义的.bundle文件,之前在很多的SDK中也可以看到它的身影,就稍微了解了一下,不难,就是在引用里面文件的时候浪费点时间,浪费的原因下面也有说,这里就记录一下如何自定义创建.bundle以及如何引用里面的资源文件.
在使用.bundle文件的时候需要注意:这个文件在运行的时候不会被编译到,So,此文件中存储的内容应该是资源文件,不能放编译的文件(比如能编译运行的代码)。
创建.Bundle文件
1、右键(双指点击) -> New File -> iOS -> Resource -> Settings Bundle
2、在这里楼主起名叫做YPhotoBundle,这里也不需要写后缀名(.bundle),然后点击Create即可
3、这个时候就会看到在创建路径下会有一个YPhotoBundle.bundle文件,右键(双指点击)打开包文件
4、里面原来的东西不需要的可以都删掉,因为楼主放的是图片资源,所以直接把Image文件夹放到了里面,然后添加到项目中,就可以看到自定的.bundle文件以及里面的资源文件
使用自定义.Bundle里面的资源文件
错误演示
先来一个错误演示,也是浪费了点时间的原因,由于第一次这么干,习惯性的Command + 单击,看到里面有这么一个方法
+ (nullable NSBundle *)bundleWithIdentifier:(NSString *)identifier;
自认为是.bundle的名字默认当做Identifier,于是就想用这个方法获取自定义的NSBundle文件,于是乎,获取图片用的是一下代码:
//获取路径
NSString * path = [[NSBundle bundleWithIdentifier:@"YPhotoBundle"] pathForResource:@"Image" ofType:nil];
//拼接路径
path = [path stringByAppendingPathComponent:@"未选中.png"];
//获取图片对象
return [UIImage imageWithContentsOfFile:path];
结果发现,返回的bundle,path,image全部为nil,于是又仔细读一下它的官方文档:
//返回之前创建过并且拥有bundle identifier的NSBundle实例
Returns the previously created NSBundle instance that has the specified bundle identifier.
/**
*如果找不到,则返回nil
*好吧我承认结果就是找不到0.0,我也不知道如何在创建.bundle的时候给予他bundle identifier
*因为在Methods for creating的方法里没有找到,如果有知道的大神,麻烦告知一下 Mark
**/
The previously created NSBundle instance that has the bundle identifier identifier. Returns nil if the requested bundle is not found.
正确用法
前面扯了段错误演示,(傲娇了一下 - -),正确的用法如下:
1、获得自定义.bundle文件的路径
//自定义的.bundle文件也存在与应用的主目录下,所以还是需要从主目录来拼接路径
-(NSString *)bundlePath
{
//获取路径
NSString * path = [[NSBundle mainBundle] pathForResource:@"YPhotoBundle" ofType:@"bundle"];
return [path stringByAppendingPathComponent:@"Image"];
}
2、在引用图片的时候在使用方法就可以获取到YPhotoBundle.bundle里面Image下的资源文件。
//获得正常未选中的图片
-(UIImage *)normalImage
{
//最后加不加.png都是可以的,因为没有重名的问题
return [UIImage imageWithContentsOfFile:[self.bundlePath stringByAppendingPathComponent:@"未选中.png"]];
}
本文介绍了如何在iOS开发中创建和使用自定义.bundle资源文件,详细步骤包括创建.bundle文件和引用其中的资源。特别强调.bundle文件在运行时不被编译,适合存放资源而非代码。并提供了错误演示和正确使用方法,指出通过NSBundle的路径获取资源的正确方式。
3649





