Cocoa Touch 框架中没有内置任何东西可以为您做这件事。您必须编写自己的代码来在运行时处理这些值。我已经为我自己的应用程序做了这个。我在实用程序类中使用了这两种方法。
+ (NSString *)processVariables:(NSString *)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)expandPlistVariables:(id)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 processVariables:(NSString *)obj]];
} else {
id newObj = [self expandPlistVariables:obj];
[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 processVariables:(NSString *)obj];
} else {
id newObj = [self expandPlistVariables:obj];
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 = @{ @"PRODUCT_NAME" : @"MyProduct", @"MY_OWN_VARIABLE_NAME" : @"Some Value" };