浅谈NSBundle
图片、xib等资源文件无法直接封入静态库,要想在静态库中使用他们,就必须借助于bundle
那么什么是bundle呢?
简单来说,bundle就是一个内部结构按照标准规则组织的特殊目录,即directory
要知道,iOS的应用都是通过bundle进行封装的,对应的bundle类型是Application类型,平时我们通过XCode编译出来的Target(即我们开发的应用),其实就是一个Application类型bundle,即一个文件夹!但是Finder会把这个bundle当做一个文件显示给我们,因为这个bundle自身也是一个package,而Mac系统会把所有的package当做一个文件来对待,显示给用户,从而防止用户误操作导致程序文件损坏或丢失。在Finder中,一个应用程序看上去和其他文件没有什么区别. 但是实际上它是一个包含了nib文件,编译代码,以及其他资源的目录,我们把这个目录叫做程序的main bundle。
其实bundle对iOS开发者来讲,最大的方便就是可以非常简单地让自己的应用国际化,在不同的语言,不同的地区,加载不同的资源文件,显示不同的语言文字,实现这些只需要我们严格按照bundle的要求进行资源文件的存放,而不需要写大量代码判断地区语言。遵循的方法也很简单:创建对应的"本地化文件夹"。例如我们要同时让图片"pic.png"在中文和英文下显示不同的内容,只需要创建两个本地化文件夹zh.lproj和en.lproj,然后分别放入同名但内容不同的"pic.png"。
由此可知,在国际化过程中,应用可以从bundle中读取图片、多媒体及nib界面等资源文件,那么静态库和framework也同样可以利用bundle这个特性,将其需要的资源文件存入bundle中,至于国际化过程中,为什么需要不同的nib文件,这一点也不难理解,对于同一个界面,中文和英文界面的布局有可能不会完全相同,这就需要创建多个同名的nib文件,将其放入bundle中对应的目录下。
bundle的使用:
bundle是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参加项目编译的。也就意味着,bundle包中不能包含可执行的文件。它仅仅是作为资源,被解析成为特定的二进制数据。
由于是静态的,bundle使用也变得非常简单:将要使用的bundle集成到项目中,要使用bundle中的资源,只需要找到相应的资源路径,一句话:bundle玩的只是路径。
//首先找到我们的bundle文件
NSBundle *myBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource: @"MyBundle" ofType :@"bundle"]]; //获取bundle中的nib资源
ViewController1 *viewCtl1 = [[ViewController1 alloc] initWithNibName: @"ViewController1" bundle: myBundle]; //获取bundle中的图片资源
UIImage *image = [UIImage imageWithContentsOfFile: [[myBundle resourcePath]
stringByAppendingPathComponent: @"0003.jpg"]]; //绝对路径法 //或者
UIImage *image = [UIImage imageWithContentsOfFile: [myBundle pathForResource: @"0003" ofType: @"jpg"]]; //相对路径法 //甚至可以...
UIImage *image1 = [UIImage imageNamed:@"MyBundle.bundle/0003.jpg"]; //纯路径法
//imageNamed方法是从mainBundle中获取资源,而此处Mybundle.bundle可以被认为是存在与mainBundle中的一个目录,这样理解该用法就比较容易了 //获取子目录中所有类型为"JPG"的文件
NSArray *arr = [myBundle pathsForResourcesOfType: @"JPG" inDirectory: nil]; //当然,可以写成预编译语句: #define MYBUNDLE_NAME @ "MyBundle.bundle"
#define MYBUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_NAME]
#define MYBUNDLE [NSBundle bundleWithPath: MYBUNDLE_PATH]
或者方法
#import <Foundation/Foundation.h> #define BUNDLE_NAME @"MyToolsWithAssetsA" @interface BundleTools : NSObject + (NSString *)getBundlePath: (NSString *) assetName;
+ (NSBundle *)getBundle; @end
#import "BundleTools.h"
@implementation BundleTools
+ (NSBundle *)getBundle{
return [NSBundle bundleWithPath: [[NSBundle mainBundle] pathForResource: BUNDLE_NAME ofType: @"bundle"]];
}
+ (NSString *)getBundlePath: (NSString *) assetName{
NSBundle *myBundle = [BundleTools getBundle];
if (myBundle && assetName) {
return [[myBundle resourcePath] stringByAppendingPathComponent: assetName];
}
return nil;
}
@end
有一点需要注意:
既然有绝对路径法可以获取bundle中的资源,为什么还要有相对路径法呢?
正如我们前面所讲,bundle对iOS开发者来讲,最大的方便就是可以非常简单地让自己的应用国际化,在不同的语言不同的地区,加载不同的资源文件,显示不同的语言文字,而实现这些只需要我们严格按照bundle的要求进行资源文件的存放即可,不需要写大量代码判断地区语言。如果我们使用文件系统的绝对路径法,当需要App国际化的时候,就只能自己去实现不同语言、不同地区的情况下加载对应的文件,如果有部分资源文件公用,部分需要国际化,那么此时,对开发人员来讲,代码维护起来将会是一场灾难。所以,我们要尽量去选用相对路径法加载资源。
浅谈NSBundle的更多相关文章
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈Hybrid技术的设计与实现第二弹
前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...
- 浅谈iOS中MVVM的架构设计与团队协作
说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...
- IOS中 浅谈iOS中MVVM的架构设计与团队协作
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈iOS中MVVM的架构设计与团队协作【转载】
今天写这篇文章是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇文章的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
随机推荐
- scrollview做定时来回滚动时,总出现错位的情况。
方法1:self.edgesForExtendedLayout = UIRectEdgeNone; 方法2: self.automaticallyAdjustsScrollViewInsets ...
- 初识ASP.NET CORE:一、HTTP pipeline
完整的http请求在asp.net framework中的处理流程: Asp.Net HttpRequest--> HTTP.exe--> inetinfo.exe(w3wp.exe)-& ...
- Java学习笔记16--异常
异常 异常是导致程序中断运行的一种指令流,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失, 所以在程序的设计中必须要考虑各种异常的发生,并正确的做好相应的处理,这样才能保证程序 ...
- 洛谷P2014 选课 (树形dp)
10月1日更新.题目:在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分 ...
- JS倒计时网页自动跳转代码
<title>JS倒计时网页自动跳转代码</title> <script language="JavaScript" type="text/ ...
- Hibernate的多表查询,分装到一个新的实体类中的一个方法
不知道是否还有其他方法实现,请高人指点. 如果涉及到多张表多字段查询,并且想利用查询出来的字段在界面层构建一个新的实体类,可以使用这种方法: 如果查询出来的多字段中,有多个字段的名字都相同(如想查询出 ...
- Silverlight 上传文件源代码
public class FileUploadArgs : EventArgs { public string FileName { get; set; } public Exception Ex { ...
- UIMenuController 实现长按显示自定义菜单功能
这段时间在集成使用融云聊天功能的时候,想自定义消息cell的长按的菜单,在网上查了查,这是根据 UIMenuController 实现的.具体代码如下,我是使用一个btn实现的 首先创建一个btn,并 ...
- noip2010-t2
题目大意:小明过生日的时候,爸爸送给他一副乌龟棋当作礼物.乌龟棋的棋盘是一行 N个格子,每个格子上一个分数(非负整数).棋盘第 1 格是唯一 的起点,第 N格是终点,游戏要求玩家控制一个乌龟棋子从起点 ...
- ubuntu 14.04加入五笔输入法
快捷键"ctrl+AIt+T",弹出终端,输入以下指令 //先卸载IBUS输入法 killall ibus-daemon sudo apt- get purge ibus ibus ...