クラス(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つのクロックを使用して行いたいと思います。私が得ることができるすべての助けに本当に感謝します。
ありがとう、
ありがとうございました!どのような愚かな監督。 –
脳波の深刻なバグや論理エラーよりも愚かな監視が良い。 :) – LucasTizma