2012-02-20 8 views
4

クラス(StopWatch)のintプロパティ(totalSeconds)を監視しようとしています。時間が1秒間隔で発生するたびにtotal秒が1ずつ増加します。カスタムクラス(DynamicLabel UILabelのサブクラスは、totalSecondsが変更されるたびにobserveValueForKeyPathメッセージを受信する必要がありますが、呼び出されることはありません。ここに関連するコードは次のとおりです。 Key-Value-ObservingとNSTimer

#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 

とビューコントローラで

dLabelはなぜこれが起こっている誰もが知ってい

DynamicLabel

のインスタンスである
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    watch = [[StopWatch alloc] init]; 
    [watch addObserver:dLabel1 forKeyPath:@"totalSeconds" options:NSKeyValueObservingOptionNew context:NULL]; 
} 

?これは、KVOが動作しているかどうかを確認するためにtotalSecondsの値を手動で変更しても同じことを試したので、NSTimerと何か関係があります。ただし、timerのfireメソッドでtotalSecondsがインクリメントされると、observeValueForKeyPathメソッドが呼び出されることはありません。また、なぜ私がこれにKVOを使用しているのか疑問に思っている人にとっては、実際のアプリケーション(これは単なるテストアプリケーション)であるため、スクリーン上に複数のストップウォッチを異なる時間に表示し、回。私はこれを1つのクロックを使用して行いたいと思います。私が得ることができるすべての助けに本当に感謝します。

ありがとう、

答えて

4

キー値の観測はプロパティでのみ機能します。あなたのタイマーは、値をインクリメントするためにプロパティアクセサを使用していません。それはKVOイベントを生成しないivarを直接変更しています。それをself.totalSeconds++に変更してください。

+0

ありがとうございました!どのような愚かな監督。 –

+2

脳波の深刻なバグや論理エラーよりも愚かな監視が良い。 :) – LucasTizma