1

我正在尝试为我的应用程序中的模型生成 HTML 输出。这将有效地遍历并使用模型中的相关值填充 HTML 文件中的各个位置。我最初只是将 HTML 模板作为格式化的字符串,但如果稍后在布局或任何东西上发生任何变化,那么将值的顺序与它们在模板中出现的顺序相匹配将会变得非常混乱和乏味.

相反,我想做的是对文件运行一种 Ruby 风格的字符串插值。任何我想从模型中获取值的地方,我都会输入我想要的模型属性的名称,如下所示#{key.path}

然后,我尝试使用以下正则表达式来处理它: @"#{([^}]+)}".

为了处理这个,我使用以下设置:

NSString *processedTemplate = [regex stringByReplacingMatchesInString:template 
                                options:0 
                                range:NSMakeRange(0, template.length) 
                                withTemplate:[self valueForKeyPath:@"$1"]];

但是,当我运行它时,我得到了错误:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
    reason: '[<Plan 0x78349d0> valueForUndefinedKey:]: this class is not 
             key value coding-compliant for the key $1.'

我期望的是我可以使用正则表达式匹配并使用它来获取模型中的键值编码兼容值。但是,这显然不适用于我使用它的方式。

附带说明一下,我认为我使用的是正确的,但是当我运行它来替换时,withTemplate:@"$1"我得到了 NULL。所以,我尝试使用:

    NSString *processedTemplate = [template stringByReplacingOccurrencesOfString:@"#{([^}]+)}" 
                                    withString:@"$1"
                                       options:NSRegularExpressionSearch 
                                         range:NSMakeRange(0, template.length)];

但是,当我运行它时,它不会替换为(). 所以无论如何,我做的不对。有人有任何指示/解决方案吗?

更新

所以看起来withString:参数将解释@"$1"为正则表达式匹配数据找到的任何内容。是否有另一种方法来检索匹配数据,以便可以将其传递给诸如valueForKeyPath:

更新

在我的旁注中,我不知道为什么,但是我的正则表达式#{([^}]+)}与我期望的不匹配。我提出的任何其他正则表达式模拟器似乎都可以很好地匹配它,但它在 iOS 上的 obj-c 中不匹配。字符集上的转义是否有我遗漏的东西#{}

4

1 回答 1

2

你的第一个例子是什么类型的对象self?你重写了valueForKeyPath:吗?

该方法-valueForKeyPath: 是为 NSObject 定义的,以根据 KVC 键路径返回一个值。编码

obj = [anotherObj valueForKeyPath: @"foo.bar.baz"];

将首先发送fooanotherObj,然后发送bar到结果,然后发送baz到结果并返回最终结果。

本质上,运行时抱怨您没有一个名为-$1.

顺便说一句,在 Objective-C 中,方法的参数是在方法本身之前评估的,所以

[self valueForKeyPath:@"$1"]

之前被评估 stringByReplacingMatchesInString:,对 .$1没有什么特别的意义valueForKeyPath:

于 2011-12-15T17:05:30.597 回答