gpt4 book ai didi

iphone - 键值观察和 NSTimer

转载 作者:可可西里 更新时间:2023-11-01 05:42:21 27 4
gpt4 key购买 nike

我正在尝试观察一个类 (StopWatch) 中的一个 int 属性 (totalSeconds),其中总秒数每次触发时增加一秒(一秒间隔)我的自定义类 (DynamicLabel) UILabel 的一个子类应该接收每次 totalSeconds 更改时都会收到一条 observeValueForKeyPath 消息,但从未调用过。相关代码如下:

#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

在 View Controller 中:

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

其中 dLabel 是 DynamicLabel 的一个实例

有人知道为什么会这样吗?它肯定与 NSTimer 有关,因为我尝试过同样的事情,我手动更改 totalSeconds 的值以检查 KVO 是否正常工作,并且工作正常。但是,当 totalSeconds 在计时器的 fire 方法中递增时,永远不会调用 observeValueForKeyPath 方法。另外,对于那些想知道为什么我为此使用 KVO 的人来说,这是因为在真正的应用程序(这只是一个测试应用程序)中,我需要在屏幕上显示多个正在运行的秒表(在不同时间)并记录耗时次。我想用一个时钟来做这件事。如果能得到任何帮助,我将不胜感激。

谢谢,

最佳答案

Key-Value Observing 仅适用于属性。您的计时器没有使用您的属性访问器来增加值;它直接更改 ivar,不会生成任何 KVO 事件。将其更改为 self.totalSeconds++,它应该可以工作。

关于iphone - 键值观察和 NSTimer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9355006/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com