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 @"" ;
我们的程序是一个 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.
|