[ios专项]NSBundle 学习-网上常见资料整理 20140520


po:近期接触到bundle,把了解到的东西大概整理下

对于初学者,其实就可以把它理解成一个目录,(告诉你文件在哪,某资源的位置在哪等)

常见的使用就是 你的ios APP想要走国际化路线的时候需要的,比如你有多国语言版本,不同语言版本下对应不同的显示界面等,这个时候就需要bundle,

具体我们来看一下:


1. BUNDLE的官方解释:

A bundle is a directory in the file system that groups executable code and related resources such as images and sounds together in one place. In iOS and OS X, applications, frameworks, plug-ins, and other types of software are bundles. A bundle is a directory with a standardized hierarchical structure that holds executable code and resources used by that code. Foundation and Core Foundation include facilities for locating and loading code and resources in bundles.

https://developer.apple.com/library/ios/documentation/CoreFoundation/Conceptual/CFBundles/AboutBundles/AboutBundles.html#//apple_ref/doc/uid/10000123i-CH100-SW7



2. NSBundle 介绍:(转的,算是介绍的比较详细的)

原文链接:http://blog.sina.com.cn/s/blog_8c87ba3b0100t89v.html

bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle,cocoa提供了类NSBundle.

我们的程序是一个bundle. 在Finder中,一个应用程序看上去和其他文件没有什么区别. 但是实际上它是一个包含了nib文件,编译代码,以及其他资源的目录. 我们把这个目录叫做程序的main bundle

bundle中的有些资源可以本地化.例如,对于foo.nib,我们可以有两个版本: 一个针对英语用户,一个针对法语用户. 在bundle中就会有两个子目录:English.lproj和French.lproj,我们把各自版本的foo.nib文件放到其中. 当程序需要加载foo.nib文件时,bundle会自动根据所设置的语言来加载. 我们会在16章再详细讨论本地化

通过使用下面的方法得到程序的main bundle
NSBundle *myBundle = [NSBundle mainBundle];

一般我们通过这种方法来得到bundle.如果你需要其他目录的资源,可以指定路径来取得bundle
NSBundle *goodBundle;
goodBundle = [NSBundle bundleWithPath:@"~/.myApp/Good.bundle"];

一旦我们有了NSBundle 对象,那么就可以访问其中的资源了
// Extension is optional
NSString *path = [goodBundle pathForImageResource:@"Mom"];
NSImage *momPhoto = [[NSImage alloc] initWithContentsOfFile:path];

bundle中可以包含一个库. 如果我们从库得到一个class, bundle会连接库,并查找该类:
Class newClass = [goodBundle classNamed:@"Rover"];
id newInstance = [[newClass alloc] init];

如果不知到class名,也可以通过查找主要类来取得
Class aClass = [goodBundle principalClass];
id anInstance = [[aClass alloc] init];

可以看到, NSBundle有很多的用途.在这当中, NSBundle负责(在后台)加载nib文件. 我们也可以不通过NSWindowController来加载nib文件, 直接使用NSBundle:
BOOL successful = [NSBundle loadNibNamed:@"About" owner:someObject];
注意噢, 我们指定了一个对象someObject作为nib的File's Owner

 

 
使用initWithContentsOfFile时,文件路径的写法 使用initWithContentsOfFile方法可以通过读取一个文件的内容来初始化对象。 但文件的路径应该怎么确定呢? 可以使用NSBundle的对象来获取。 例如当前程序所在目录下有个文件re.xml,我们要将该文件的内容做为NSData的数据源来初始化一个NSData对象,可以用下面的方法来实现:

<span style="font-size:14px;">NSString *filePath = [[NSBundle mainBundle] pathForResouse:@"re" ofType:@"xml"]; </span>
<span style="font-size:14px;">NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];</span>

 
读取plist中的内容:
<span style="background-color: rgb(255, 255, 255);"><span style="font-size:14px;">NSString *dataPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]; self.data = [NSArray arrayWithContentsOfFile:dataPath];</span></span>



删除本地文件
<span style="background-color: rgb(255, 255, 255);"><span style="font-size:14px;">NSString * thePath=[self getUserDocumentDirectoryPath];
NSMutableString * fullPath=[[[NSMutableString alloc]init]autorelease];
[fullPath appendString:thePath];
NSString * idString=[idArray objectAtIndex:indexPath.row];
NSString * coverName=[NSString stringWithFormat:@"/%@.jpg",idString];
[fullPath appendString:coverName];
NSFileManager *defaultManager;
defaultManager = [NSFileManager defaultManager];



- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error </span></span>
<span style="background-color: rgb(255, 255, 255);"><span style="font-size:14px;">BOOL boolValue=[defaultManager removeItemAtPath: fullPath error: nil];

if (boolValue) {
NSLog(@"remove cover image ok");
}

- (NSString*)getUserDocumentDirectoryPath {
NSArray* array = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask,YES);

if([array count])
return [array objectAtIndex: 0];
else return @"";

}
</span></span>


3. 举个例子就会用了。。

原文链接:http://blog.sina.com.cn/s/blog_7b9d64af01018acx.html

mainBundle方法:

Returns the NSBundle object that corresponds to the directory where the current application executable is located.

+ (NSBundle *)mainBundle

该方法:返回NSBundle 对象;可以用该对象来返回应用程序可操作的路径和文件。

 

NSBundle *myBundle = [NSBundle mainBundle];

已经包括了很多已经封装好的方法。


1、loadNibNamed方法:

- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options

参数:

name:nib文件的名称

owner:指定name参数所指代的nib文件的File's Owner

options:当nib文件开始时,需要的数据

返回值:返回符合对象的数组。

例子:初始化一个View

CustomCell *cell=(CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellTableIdentifier];
if (cell==nil) {
NSArray *nib=[[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:selfoptions:nil];
cell=[nib objectAtIndex:0];// 因为返回的是数组
}


 





4. 疑问:

原文链接:http://www.cocoachina.com/ask/questions/show/108158

[Q]:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

这个方法是用来作什么的?什么时间调用?nibName和bundle是什么?

[A]:

alloc用于创建视图控制器对象,然后采用initWithNibName:bundle:初始化,init方法第一个参数指定控制器需要装载的nib文件,第二个参数需要指定bundle。bundle是一个包含代码和资源的文件系统位置的抽象。在文件系统中使用bundle定位资源的好处是:bundle提供了方便和简单的API,bundle对象通过文件名称能定位资源。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值