zoukankan      html  css  js  c++  java
  • IOS 之 NSBundle 使用

    来源:http://blog.sina.com.cn/s/blog_b0c59541010151rd.html

    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是将程序中所有资源捆在一起的对象
     

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

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

    版本号:Bundle version

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

    应用标识:Bundle identifier

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

    应用名称:Bundle display name

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

    Bundle name

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

    2.应用程序语言本地化

    app本地化宏

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

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

    "none" = "确定";
    
    "none" = "none";
    

    宏的用法:(返回NSString *)

    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"]];
  • 相关阅读:
    (Good Bye 2019) Codeforces 1270B Interesting Subarray
    (Good Bye 2019) Codeforces 1270A Card Game
    Codeforces 1283D Christmas Trees(BFS)
    Codeforces 1283C Friends and Gifts
    Codeforces 1283B Candies Division
    1095 Cars on Campus (30)
    1080 Graduate Admission (30)
    1099 Build A Binary Search Tree (30)
    1018 Public Bike Management (30)
    1087 All Roads Lead to Rome (30)
  • 原文地址:https://www.cnblogs.com/sunminmin/p/3800804.html
Copyright © 2011-2022 走看看