iOS如何在SDK中使用资源文件(xib,image,localizable string...)

栏目: IOS · 发布时间: 7年前

内容简介:SDK中使用xib,图片或者其他资源文件时不同于直接在一个项目中使用的方法,因为我们必须明确一点,SDK中只有.h,.m,.mm,.swift等文件可以直接导入使用,像图片,xib文件,做国际化的.string文件等资源文件无法直接通过加载Framework的路径找到,我们必须要在项目Build Phases的Copy Bundle Resources添加我们需要使用的资源文件(nib, image, .string...),因此,我们最好在SDK中新建一个Bundle文件存放所有的资源文件,然后在主工程
  • 了解如何创建SDK
  • 了解如何在一个项目中导入并使用SDK

GitHub地址(附代码) : 如何在SDK中使用资源文件

简书地址 : 如何在SDK中使用资源文件

博客地址 : 如何在SDK中使用资源文件

掘金地址 : 如何在SDK中使用资源文件

原理

SDK中使用xib,图片或者其他资源文件时不同于直接在一个项目中使用的方法,因为我们必须明确一点,SDK中只有.h,.m,.mm,.swift等文件可以直接导入使用,像图片,xib文件,做国际化的.string文件等资源文件无法直接通过加载Framework的路径找到,我们必须要在项目Build Phases的Copy Bundle Resources添加我们需要使用的资源文件(nib, image, .string...),因此,我们最好在SDK中新建一个Bundle文件存放所有的资源文件,然后在主工程中Copy Bundle Resources添加该bundle文件即可加载所有SDK中的资源文件.

创建Bundle

为了统一存放SDK中所有资源文件

注意:我们需要在每次编译完成后手动或写脚本自动将资源文件拷贝到Bundle中以至于才能在主工程中生效。

此后我们在SDK项目所用到的所有资源文件都应该放到Bundle之中。

iOS如何在SDK中使用资源文件(xib,image,localizable string...)

情景分类

一.使用Xib文件

1. Build SDK工程

如果项目中包含xib文件,则项目每次编译后会在Framework中将自动生成nib文件,如下图所示

iOS如何在SDK中使用资源文件(xib,image,localizable string...)

2.将新编译好的Framework放入工程中

  • 首先拷贝编译好的framework到我们工程目录中(即工程中进入Framework,不会自行百度)
  • 使用Nib文件分为两种方式
    • 直接将Nib文件导入主项目资源文件中
    • (推荐)将Framework中编译好的Nib文件放入Bundle中,再将Bundle导入项目的资源文件中,好处是可以统一管理一个Framework中所有的资源文件
iOS如何在SDK中使用资源文件(xib,image,localizable string...)

如果只使用nib则如下图,否则可按相同方式将bundle导入项目

iOS如何在SDK中使用资源文件(xib,image,localizable string...)

3. 使用SDK中的xib文件

  • 直接使用framework中的nib文件
NSString *path = [[NSBundle mainBundle] pathForResource:@"XDXTestFramework" ofType:@"framework"];
    TestJumpVC *vc = [[TestJumpVC alloc] initWithNibName:@"TestJumpVC" bundle:[NSBundle bundleWithPath:path]];
    
    [self presentViewController:vc animated:YES completion:nil];
复制代码
  • (推荐)使用framework中bundle中的nib文件。

因为我们在第二步中已经将bundle放入项目的copy bundle resources中,所以下面代码中使用 [NSBundle mainBundle]

NSString *path = [[NSBundle mainBundle] pathForResource:@"XDXAllResources" ofType:@"bundle"];
    TestJumpVC *vc = [[TestJumpVC alloc] initWithNibName:@"TestJumpVC" bundle:[NSBundle bundleWithPath:[path stringByAppendingString:@"/xibs"]]];

    [self presentViewController:vc animated:YES completion:nil];
复制代码

如果未进行第2步中将nib文件导入项目则程序会crash,并提示“Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/containers/Bundle/Application/D46C1A83-E6F4-4DB2-8F02-EC0ED05C6C99/XDXSDKResourceFileDemo.app> (loaded)' with name 'TestJumpVC''”

二.使用图片

1. 将图片拷贝到Framework中创建好的bundle中

iOS如何在SDK中使用资源文件(xib,image,localizable string...)

2. 使用图片,加载bundle中图片的路径(Note:必须与真实路径相同,可参考Demo)

// Test image
    NSString *path = [[[NSBundle mainBundle] pathForResource:@"XDXAllResources" ofType:@"bundle"] stringByAppendingString:@"/images/1.png"];
    self.testImage.image = [UIImage imageWithContentsOfFile:path];
复制代码

三.使用国际化语言适配(中英文适配)

1.创建.string类型文件以支持中英文

iOS如何在SDK中使用资源文件(xib,image,localizable string...)

2. 设置strings文件的Localize使其支持多种语言

iOS如何在SDK中使用资源文件(xib,image,localizable string...)

3. 设置项目支持多种语音

iOS如何在SDK中使用资源文件(xib,image,localizable string...)
iOS如何在SDK中使用资源文件(xib,image,localizable string...)

4. 在多语言文件中添加对应的字符

iOS如何在SDK中使用资源文件(xib,image,localizable string...)

5. 创建NSBundle分类提供类方法以支持在SDK中使用多语言

原理同上,即在budle中找到对应的中英文sting文件,然后利用 - (NSString *)localizedStringForKey:(NSString *)key value:(nullable NSString *)value table:(nullable NSString *)tableName NS_FORMAT_ARGUMENT(1); 方法来检索bundle中对应语言的字符串。

代码中涉及APP手动选择中英文模式,而我们这里主要实现根据系统当前设置的语言环境,所以忽略人为设置语言的情况

// Note : Be consistent with you create bundle‘s name.
#define XDXRouterResBundle @"XDXAllResources"

@implementation NSBundle (XDXLocalizable)

+ (instancetype)XDX_localizableBundleWithBundleName:(NSString *)bundleName {
    static NSBundle *localizableBundle = nil;
    if (localizableBundle == nil) {
        if (!bundleName) {
            bundleName = XDXRouterResBundle;
        }
        NSString *bundleType = nil;
        if (bundleName && ![bundleName hasSuffix:@"bundle"]) {
            bundleType = @"bundle";
        }
        NSString *bundlePath = [[NSBundle mainBundle] pathForResource:bundleName ofType:bundleType];
        
        localizableBundle = [NSBundle bundleWithPath:bundlePath];
    }
    return localizableBundle;
}

+ (NSString *)XDX_localizedStringForKey:(NSString *)key {
    return [self XDX_localizedStringForKey:key value:nil];
}

+ (NSString *)XDX_localizedStringForKey:(NSString *)key value:(NSString *)value{
    NSBundle *bundle = nil;
    //NSString *language = [self getLanguageFromSystem];
    //NSString *language = [self getLanguageFromPlist];
    NSString * language = [self getLanguageFromDevelopersSetup];
    if (!language) {
        language = [self getLanguageFromSystem];
        NSLog(@"Current language is %@",language);
    }
    //从FrameworkTestBundle.bundle中查找资源
    NSString *bundlePath = [[NSBundle XDX_localizableBundleWithBundleName:nil] pathForResource:language ofType:@"lproj"];
    bundle = [NSBundle bundleWithPath:bundlePath];
    value = [bundle localizedStringForKey:key value:value table:nil];
    return [[NSBundle mainBundle] localizedStringForKey:key value:value table:nil];
}

//这个设置语言是通过读取当前系统使用语言
+ (NSString *)getLanguageFromSystem{
    NSString *language = [NSLocale preferredLanguages].firstObject;
    if ([language hasPrefix:@"en"]) {
        language = @"en";
    } else if ([language hasPrefix:@"zh"]) {
        if ([language rangeOfString:@"Hans"].location != NSNotFound) {
            language = @"zh-Hans"; // 简体中文
        } else {
            language = @"zh-Hant"; // 繁體中文
        }
    } else {
        language = @"en";
    }
    return language;
}

//这个是设置语言通过Plist文件来读取
+ (NSString *)getLanguageFromPlist{
    NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"SDKInternationalizationDemoPlist.plist" ofType:nil];
    if (!bundlePath) {
        return nil;
    }
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:bundlePath];
    if (dict) {
        NSInteger languageNum = [[dict valueForKey:@"language"] integerValue];
        switch (languageNum) {
            case 1:
                return @"en";     //语言为英语:en
                break;
            case 2:
                return @"zh-Hans";//语言为简中:zh-Hans
                break;
            case 3:
                return @"zh-Hant";//语言为繁中:zh-Hanz
                break;
            default:
                return @"en";
                break;
        }
    }
    return @"en";
}

//这个是设置语言通过开发者手动调用,从NSUserDefaults里面去读kDSADLanguageStyle这个字段是哪一种语言
+ (NSString *)getLanguageFromDevelopersSetup{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSInteger languageStyle = [[userDefaults valueForKey:@"TODO"] integerValue];
    if (!languageStyle) {
        return nil;
    }
    switch (languageStyle) {
        case 1:
            return @"en";
            break;
        case 2:
            return @"zh-Hans";
            break;
        case 3:
            return @"zh-Hant";
            break;
        default:
            return @"en";
            break;
    }
}

@end
复制代码

6.在代码中使用多语言字符串

self.testLabel.text = [NSBundle XDX_localizedStringForKey:@"Test"];
复制代码

附:在Framework每次编译后添加脚本来拷贝资源文件到Bundle中

原因

每当资源文件有所改动,例如图片的增加减少,strings文件中添加新字段等等,我们都需要手动将新的文件放入Bundle对应的文件夹下,如果我们想利用脚本自动放所有资源文件,可利用Xcode特性。

操作

  • 首先,在项目中新建一个脚本

    iOS如何在SDK中使用资源文件(xib,image,localizable string...)
  • 其次,在脚本中将我们项目的所有资源文件拷贝到bundle中对应的目录下(注意:文件路径必须正确,如遇到Framework中的nib文件,项目的位置在个人电脑中是不用的,需要查询并修改)

    iOS如何在SDK中使用资源文件(xib,image,localizable string...)
  • 最后,我们在Build完项目后,所有资源文件会更新到最新

    iOS如何在SDK中使用资源文件(xib,image,localizable string...)

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

Usability for the Web

Usability for the Web

Tom Brinck、Darren Gergle、Scott D. Wood / Morgan Kaufmann / 2001-10-15 / USD 65.95

Every stage in the design of a new web site is an opportunity to meet or miss deadlines and budgetary goals. Every stage is an opportunity to boost or undercut the site's usability. Thi......一起来看看 《Usability for the Web》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换