在进行资源封装的时候用到了自定义的.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;
1
1
自认为是.bundle的名字默认当做Identifier,于是就想用这个方法获取自定义的NSBundle文件,于是乎,获取图片用的是一下代码:
//获取路径
NSString* path = [[NSBundlebundleWithIdentifier:@"YPhotoBundle"] pathForResource:@"Image"ofType:nil];
//拼接路径
path = [path stringByAppendingPathComponent:@"未选中.png"];
//获取图片对象
return[UIImageimageWithContentsOfFile: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 nilifthe requested bundle is not found.
正确用法
前面扯了段错误演示,(傲娇了一下 - -),正确的用法如下:
1、获得自定义.bundle文件的路径
//自定义的.bundle文件也存在与应用的主目录下,所以还是需要从主目录来拼接路径
-(NSString*)bundlePath
{
//获取路径
NSString* path = [[NSBundlemainBundle] pathForResource:@"YPhotoBundle"ofType:@"bundle"];
return[path stringByAppendingPathComponent:@"Image"];
}
2、在引用图片的时候在使用方法就可以获取到YPhotoBundle.bundle里面Image下的资源文件。
//获得正常未选中的图片
-(UIImage*)normalImage
{
//最后加不加.png都是可以的,因为没有重名的问题
return[UIImageimageWithContentsOfFile:[self.bundlePathstringByAppendingPathComponent:@"未选中.png"]];
}