КВО (IOS 5) на простых типах (не NSObject) - PullRequest
3 голосов
/ 17 января 2012

У меня проблемы с тем, чтобы IOS (target-c) KVO работал для ключа типа int.

Мой класс объявляет свойство sampleValue типа int. Поскольку int автоматически не реализует функциональность KVO, я переопределил метод automaticNotifiesObserversforKey следующим образом:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey {

    BOOL automatic = NO;
    if ([theKey isEqualToString:@"sampleValue"]) {
        automatic = NO;
    } else {
        automatic=[super automaticallyNotifiesObserversForKey:theKey];
    }
    return automatic;
}

Метод вызывается так, как я и ожидал. Я также реализовал метод установки для свойства sampleValue следующим образом:

- (void) setSampleValue:(int)newSampleValue
{
    [self willChangeValueForKey:@"sampleValue"];
    sampleValue = newSampleValue;
    [self didChangeValueForKey:@"sampleValue"];
}

Настройка наблюдателя в классе наблюдателя выполняется следующим образом (dc является экземпляром наблюдаемого объекта):

[dc addObserver:self forKeyPath:@"sampleValue" options:NSKeyValueObservingOptionNew context:NULL];

Однако, когда sampleValue обновляется, уведомление моему объекту-наблюдателю не отправляется. Обновление другого свойства типа NSDate работает абсолютно нормально.

Может ли кто-нибудь помочь мне понять, что я делаю неправильно или что я должен сделать, чтобы сделать эту работу.

С наилучшими пожеланиями Том

1 Ответ

7 голосов
/ 17 января 2012

Возможно, я что-то упускаю в вашем вопросе, но вы можете наблюдать свойства типа int так же легко, как и другие типы, не делая ничего особенного.

Попробуйте удалить +automaticallyNotifiesObserversForKey: override и -setSampleValue: setter, и просто синтезируйте методы доступа для sampleValue:

@synthesize sampleValue;

int - это тип значения, соответствующего ключу @"sampleValue", но это не то, что наблюдается. Наблюдаемый объект - dc, и он позаботится об отправке соответствующего уведомления при изменении свойства sampleValue.

...