2011-12-15 3 views
1

Я пытаюсь сгенерировать HTML-вывод для модели в моем приложении. Это эффективно пройдет и заполнит различные точки внутри HTML-файла соответствующими значениями в модели. Первоначально я собирался взять HTML-шаблон как форматированную строку, но если что-то изменится позже в макете или что-то еще, это будет просто очень грязно и утомительно, чтобы соответствовать порядку значений в порядке, который они отображают в шаблоне ,Строчная интерполяция в стиле Ruby с iOS NSRegularExpression

Вместо этого я пытаюсь выполнить некоторую строковую интерполяцию файла в стиле Ruby. В любом месте, где я хочу получить значение из модели, я ставлю имя атрибута модели, который я хочу так: #{key.path}.

Затем, я пытаюсь обработать это с помощью следующего Regex: @"#{([^}]+)}".

Для обработки этого я использую следующие настройки:

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)]; 

Однако, когда я запускаю это не заменить секции в (). Так или иначе, я ничего не делаю правильно. У кого-нибудь есть указатели/решения?

Update

Так это выглядит как параметр withString: будет интерпретировать @"$1", как все, что нашел данные матча регулярного выражения. Есть ли другой способ получить данные соответствия, чтобы он мог быть передан таким образом, как valueForKeyPath:?

Update

На моей стороне записки, я не знаю, почему, но мое регулярное выражение #{([^}]+)} не соответствует, как я ожидаю, что это. Любой другой симулятор регулярных выражений, с которым я сталкивался, похоже, соответствует ему просто отлично, но он не соответствует в obj-c на iOS. Есть ли что-то, что мне не хватает с экранами на набор символов #{}?

+0

Я нашел решение общей проблемы здесь http://stackoverflow.com/questions/8935466/grmustache-formatted-numbers-or-an-html-template-engine-with-number-formatting, но я сохраняя это открытым, если кто-то может понять, почему моя реализация выше не работала, или как ее исправить. –

ответ

2

Что это за объект self в вашем первом примере? Вы переопределили valueForKeyPath:?

Метод -valueForKeyPath: определен для NSObject для возврата значения на основе путей ключа KVC. Код

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

будет первым отправить foo в anotherObj, а затем отправить bar к результату, а затем отправить baz к результату, что и возвращает конечный результат.

По существу, среда выполнения жалуется, что у вас нет метода под названием -$1.

И, кстати, в параметрах Objective-C методам вычисляются до самого метода, так

[self valueForKeyPath:@"$1"] 

оценивается до тогоstringByReplacingMatchesInString: и $1 не означает, что ничего особенного в valueForKeyPath:.

+0

Это расширение NSObject. Я могу использовать 'setValue: forKeyPath:]' и 'valueForKey:' таким образом, поэтому я не понимаю, почему я не смог бы использовать 'valueForKeyPath:' также. Должна ли @ "$ 1" просто интерпретироваться как возвращаемое значение из соответствия Regex? –

+2

@Josh: Нет. '@" $ 1 "' это буквальная строка, состоящая из знака доллара, за которым следует цифра для одного. – JeremyP