• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 自定义 plist 文件中的变量

[复制链接]
菜鸟教程小白 发表于 2022-12-12 14:21:22 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我知道可以通过预处理 Info.plist 文件将变量存储在默认的 Info.plist 文件中。我想知道是否可以使用自定义 plist 文件做类似的事情。

我通过以下代码加载 plist 文件:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *customPlistPath = [path stringByAppendingPathComponent"custom.plist"];
NSDictionary *plistData = [NSDictionary dictionaryWithContentsOfFile:customPlistPath];

是否可以输入 ${PRODUCT_NAME} 或 ${MY_OWN_VARIABLE_NAME} 之类的值,并在我读入自定义 plist 文件后对其进行处理?目前,当我将自定义 plist 文件读入 NSDictionary 时,变量值没有被替换



Best Answer-推荐答案


Cocoa Touch 框架中没有内置任何东西可以为您执行此操作。您必须编写自己的代码来在运行时处理这些值。我已经为我自己的应用程序做了这个。我在实用程序类中使用了这两种方法。

+ (NSString *)processVariablesNSString *)string {
    if (string.length == 0) {
        return string;
    }

    NSRange range = [string rangeOfString"${" options:NSLiteralSearch];
    if (range.location != NSNotFound) {
        NSMutableString *res = [string mutableCopy];
        do {
            NSRange close = [res rangeOfString"}" options:NSLiteralSearch];
            if (close.location == NSNotFound) {
                break; // Uh-oh - bad
            }

            NSRange rngVar = NSMakeRange(range.location, close.location - range.location + 1);
            NSString *var = [res substringWithRange:NSMakeRange(rngVar.location + 2, rngVar.length - 3)];
            NSString *val = [variables objectForKey:var];
            if (val) {
                [res replaceCharactersInRange:rngVar withString:val];
            } else {
                [res replaceCharactersInRange:rngVar withString:var];
            }

            range = [res rangeOfString"${" options:NSLiteralSearch];
        } while (range.location != NSNotFound);

        return res;
    } else {
        return string;
    }
}

+ (id)expandPlistVariablesid)root {
    if ([root isKindOfClass:[NSArray class]]) {
        NSArray *array = (NSArray *)root;
        NSMutableArray *res = [[NSMutableArray alloc] initWithCapacity:array.count];
        for (id obj in array) {
            if ([obj isKindOfClass:[NSString class]]) {
                [res addObject:[self processVariablesNSString *)obj]];
            } else {
                id newObj = [self expandPlistVariablesbj];
                [res addObject:newObj];
            }
        }

        return res;
    } else if ([root isKindOfClass:[NSDictionary class]]) {
        NSDictionary *dict = (NSDictionary *)root;
        NSMutableDictionary *res = [[NSMutableDictionary alloc] initWithCapacity:dict.count];
        for (NSString *key in [dict allKeys]) {
            id obj = dict[key];
            if ([obj isKindOfClass:[NSString class]]) {
                res[key] = [self processVariablesNSString *)obj];
            } else {
                id newObj = [self expandPlistVariablesbj];
                res[key] = newObj;
            }
        }

        return res;
    } else {
        // oops
        return root;
    }
}

您将传入从 plist 加载的字典(或数组)并返回一个新字典(或数组),其中包含变量引用的所有字符串值都已更新。

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *customPlistPath = [path stringByAppendingPathComponent"custom.plist"];
NSDictionary *plistData = [NSDictionary dictionaryWithContentsOfFile:customPlistPath];
plistData = [UtilityClass expandPlistVariables:plistData];

在代码中,variables 是一个包含变量值的NSDictionary。此字典中的键是您的 plist 中 ${} 之间的值。示例:

variables = @{ @"RODUCT_NAME" : @"MyProduct", @"MY_OWN_VARIABLE_NAME" : @"Some Value" };

关于ios - 自定义 plist 文件中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18708278/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap