zoukankan      html  css  js  c++  java
  • Bundle文件的创建和使用(二)

    1.概念:

    An NSBundle object represents a location in the file system that groups code and resources that can be used in a program. NSBundle objects locate program resources, dynamically load and unload executable code, and assist in localization. You build a bundle in Xcode using one of these project types: Application, Framework, plug-ins.
    大概翻译过来:
    NSBundle 对象指代相应应用程序下的所有可用的文件系统。就是说,可以用NSBundle操作应用程序下,所有可用的资源(包括,xib文件,数据文件,图片 等)。
    NSBundle 英语中的解释是:“捆,束”的意思,那我们可以理解为:
    NSBundle是将程序中所有资源捆在一起的对象
     
    2.bundle的说明:

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

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

    通过使用下面的方法得到程序的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

    3.bundle的用法:

    1)获取app的info.plist详细信息

    版本号:Bundle version

    1 NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

    应用标识:Bundle identifier

    1 NSString *bundleId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];

    应用名称:Bundle display name

    1 NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];

    Bundle name

    1 NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];

    2.应用程序语言本地化

    app本地化宏

    1 #define XLocalizedString(key, comment)        [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

    中英文两个Localizable.strings文件中键值对,例如

    1 "none" = "确定";
    2 "none" = "none";

    宏的用法:(返回NSString *)

    1 localizedString("none", "这是注释")

    3.获取包内文件路径和文件

    获取app包路径

    NSString *path = [[NSBundle mainBundle] bundlePath];

    app资源目录路径

    NSString *resPath = [[NSBundle mainBundle] resourcePath];
     获取资源目录下a.bundle
    NSString* path = [resPath stringByAppendingPathComponent:@"a.bundle"];
    NSBundle *bundle = [NSBundle bundleWithPath:path];
     获取app包的readme.txt文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:@"readme" ofType:@"txt"];




    //一旦我们有了bundle,就可以访问其中的资源文件了。
    NSString path = [otherBundle pathForImageResource:@"img"];
    NSImage img = [[NSImage alloc] initWithContentsOfFile:path];
    //bundle中可以包含一个库. 如果我们从库得到一个class, bundle会连接库,并查找该类:
    Class newClass = [otherBundle classNamed:@"Person"];
    id person = [[newClass alloc] init];
    //如果不知到class名,也可以通过查找主要类来取得
    Class aClass = [otherBundle principalClass];
    id classInstance = [[aClass alloc] init];
    //可以看到, NSBundle有很多的用途.在这章中, NSBundle负责(在后台)加载nib文件. 我们也可以不通过NSWindowController来加载nib文件, 直接使用NSBundle:
    BOOL flag = [NSBundle loadNibNamed:@"ViewController" owner:someObject];
    //注意噢, 我们指定了一个对象someObject作为nib的File”s Owner
     
    获取XML文件
    NSString *filePath = [[NSBundle mainBundle] pathForResouse:@"re" ofType:@"xml"];
    NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
    获取属性列表 
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"ViewControllers" ofType:@"plist"]];
  • 相关阅读:
    spring mvc文件上传,request对象转换异常
    解决国内android sdk无法更新,google不能的简单办法
    1.5 高速找出机器故障
    图的深度优先搜索与广度优先搜索
    我对ThreadLocal的理解
    Leetcode--3Sum
    <转>Openstack Ceilometer监控项扩展
    怎样利用WordPress创建自己定义注冊表单插件
    java_免费视频课程汇总
    HDU 3641 Pseudoprime numbers(快速幂)
  • 原文地址:https://www.cnblogs.com/cy568searchx/p/5055049.html
Copyright © 2011-2022 走看看