Принуждение типа KVC - PullRequest
1 голос
/ 17 марта 2011

Я хотел бы проанализировать XML для заполнения объектов, совместимых с KVC, но мой синтаксический анализатор очень тупой, он просто собирает строки NSStrings из атрибутов / тегов XML и пытается установить их через KVC.

Это работает на самом делестроки и числа (я считаю), но мне нужно также установить даты.Проблема, очевидно, в том, что синтаксический анализатор не знает, что строка представляет собой дату, и пытается разместить ее, используя ванильные вызовы KVC - после чего платформа KVC жалуется на несоответствие типов (установка строки в поле даты).

Есть ли программный способ «перехватывать» вызовы в платформе KVC, чтобы я мог изменять устанавливаемые данные (запускать строку даты через NSDateFormatter)?

Я мог бы добавить немного интеллекта в анализаторно прежде чем делать это, есть ли другие известные решения для этого типа проблемы?

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Возможно, это не идеальное решение, но ... я бы хотел поделиться своими идеями;)

Итак, прежде всего, посмотрите здесь: Кодирование значения ключа -Проверка .В этом документе описан удобный способ проверки вашей переменной в тот момент, когда она установлена ​​с помощью KVC.Вы можете использовать это в своих интересах следующим образом:

  1. Сначала реализуйте метод проверки KV для переменной класса
  2. Установите значение
  3. В своем методе проверки проверьте,дата / строка / все, что вы хотите - и измените его на правильный тип.

Это должно обеспечить чистую реализацию для обеспечения правильного типа.

Приветствия, Павел

0 голосов
/ 17 марта 2011

С KVC все проходит через реализацию по умолчанию setValue:forKey:, которая вызывает соответствующий метод мутатора (, как описано здесь ).

Вы можете просто переопределить setValue:forKey:, чтобы проверитьключ или ключи, которые нуждаются в преобразовании и вносят соответствующие изменения.

- (void)setValue:(id)value forKey:(NSString *)key
{
    if([key isEqualToString:@"someDate"]) {
        NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        someDate = [dateFormatter dateFromString:value];
        value = somedate;
    }

    [super setValue:value forKey:key];
}

Это из памяти, поэтому нет гарантий, будет ли он на самом деле скомпилирован и запущен.; -)

...