Ключ-Значение-Наблюдение и NSTimer - PullRequest
4 голосов
/ 20 февраля 2012

Я пытаюсь наблюдать свойство int (totalSeconds) в классе (StopWatch), где общее количество секунд увеличивается на единицу каждый раз, когда запускается время (интервалы в одну секунду), мой пользовательский класс (DynamicLabel) должен получить подкласс UILabelсообщение Наблюдать за сообщением каждый раз, когда изменяется значение totalSeconds, но оно никогда не вызывается.Вот соответствующий код:

#import "StopWatch.h"
@interface StopWatch ()

@property (nonatomic, strong) NSTimer *timer;

@end

@implementation StopWatch
@synthesize timer;
@synthesize totalSeconds;

- (id)init
{
    self = [super init];
    if (self) {
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fireAction:) userInfo:nil repeats:YES];
        [runLoop addTimer:timer forMode:NSRunLoopCommonModes];
        [runLoop addTimer:timer forMode:UITrackingRunLoopMode];
    }
    return self;
}    

- (void)fireAction:(NSTimer *)aTimer
{
    totalSeconds++;
}

@end
#import "DynamicLabel.h"

@implementation DynamicLabel

@synthesize seconds;

- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context
{
    seconds ++;
    [self setText:[NSString stringWithFormat:@"%i",seconds]];
}


@end

и в контроллере представления:

- (void)viewDidLoad
{
    [super viewDidLoad];
    watch = [[StopWatch alloc] init];
    [watch addObserver:dLabel1 forKeyPath:@"totalSeconds" options:NSKeyValueObservingOptionNew context:NULL];
}

, где dLabel - это экземпляр DynamicLabel

Кто-нибудь знает, почему это происходит??Это определенно как-то связано с NSTimer, потому что я попробовал то же самое, где я вручную изменяю значение totalSeconds, чтобы проверить, работает ли KVO, и это работает нормально.Тем не менее, когда totalSeconds увеличивается в методе запуска таймера, метод НаблюдатьВыбуждающий_Клиент никогда не вызывается.Кроме того, для тех, кто интересуется, почему я использую KVO для этого, это потому, что в реальном приложении (это просто тестовое приложение) мне нужно отображать несколько запущенных секундомеров (в разное время) на экране и записывать прошедшеераз.Я хотел бы сделать это, используя одни часы.Я бы очень признателен за любую помощь, которую я могу получить.

Спасибо,

1 Ответ

4 голосов
/ 20 февраля 2012

Наблюдение значения ключа работает только для свойств. Ваш таймер не использует ваш метод доступа к свойству для увеличения значения; он напрямую меняет ивар, который не будет генерировать никаких событий КВО. Измените его на self.totalSeconds++, и оно должно работать.

...