NSBundle

6 篇文章 0 订阅
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 对象,可以用下面的方法来实现:

NSString *filePath = [[NSBundle mainBundle] pathForResouse:
@"re" ofType: @"xml" ]; NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];

读取 plist 中的内容:
NSString *dataPath = [[NSBundle mainBundle] pathForResource:
@"Data" ofType: @"plist" ]; self .data = [NSArray arrayWithContentsOfFile:dataPath];

删除本地文件
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 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 @"" ;
   
}



NSBundle的使用,注意mainBundle和Custom Bundle的区别

1、[NSBundle mainBundle],文件夹其实是Group,如左侧的树形文件管理器

Build之后,文件直接就复制到了根目录下,于是读取的方法,应该是这样:

NSString  *earth = [[ NSBundle  mainBundle] pathForResource:@ "Brad Cox"  ofType:@ "png" ];

2、使用文件夹的时候,Build结果

依然使用同样的方法,不需要制定文件夹路径

//inDirectory参数可有可无
NSString *earth = [[NSBundle mainBundle] pathForResource:@"Matthijs" ofType:@"png" inDirectory:@"Images/MoreImages"]; 
NSString *earth = [[NSBundle mainBundle] pathForResource:@"Matthijs" ofType:@"png"];

 

编译之后,mainBundle的资源都是放到RootFolder下,所以,可以直接访问,不要指定内部路径

 

3、使用其他的Bundle

 

NSString  *resourceBundle = [[ NSBundle  mainBundle] pathForResource:@ "Resources"  ofType:@ "bundle" ];
     NSLog (@ "resourceBundle: %@" , resourceBundle);
     NSString  *earth = [[ NSBundlebundleWithPath :resourceBundle] pathForResource:@ "Matthijs" ofType:@ "jpg" inDirectory:@ "Images/MoreImages" ];
 
     NSLog (@ "path: %@" , earth);

使用Custom bundle,访问内部的子文件夹,需要指定inDirectory参数,这个mainBundle不同,这是为何?

注意:Since
bundles other than the main bundle can have folders embedded inside them, to access
files inside folders of a bundle other than the main bundle it is best to use the pathFor
Resource:ofType:inDirectory: method of NSBundle  to explicitly specify the folder in
which a specific file/resource exists.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值