我查看了许多与NSTimer问题相关的不同帖子,我尝试了很多不同的组合,让它按照我想要的方式工作,但是我仍然无法让它正常工作。
我对计时器有两个要求,一个是重复计时器,每隔10秒从Web服务中提取数据。这似乎工作正常。第二个要求是,无论何时在接口中更新值,都会创建一个非重复计时器,该计时器将在值更改后0.3秒更改接口中值的文本颜色。
我似乎只是第一次看到文字颜色发生变化,随后也不会改变......这让我疯了。
这是一些代码......
在界面中我定义了一个属性:
@property (strong) NSTimer *colorTimer;
在实现中,只要需要在接口中更新值,就会调用此函数:
- (void)setBtcValue:(float)value
{
bool moveIsPositive = (value > btcValue) ? true : false;
bool moveIsNeutral = (value == btcValue) ? true : false;
btcValue = value;
if(moveIsPositive && !moveIsNeutral)
{
[uiValueTextField setTextColor:[NSColor greenColor]];
self.colorTimer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(resetTextColor) userInfo:nil repeats:YES];
} else if(!moveIsPositive && !moveIsNeutral)
{
[uiValueTextField setTextColor:[NSColor redColor]];
self.colorTimer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(resetTextColor) userInfo:nil repeats:YES];
}
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[uiValueTextField setStringValue: [formatter stringFromNumber:[NSNumber numberWithFloat:btcValue]]];
[uiValueTextField sizeToFit];
NSRect newFrame = NSMakeRect(0, 0, uiValueTextField.bounds.size.width+20, self.view.bounds.size.height);
[self.view setFrame:newFrame];
}
定时器关闭时触发的功能如下:
- (void) resetTextColor
{
NSLog(@"Timer Fired");
[uiValueTextField setTextColor:[NSColor blackColor]];
[self.colorTimer invalidate];
self.colorTimer = nil;
}
我知道让计时器重复然后手动使其无效是没有意义的,但正如我所说,我尝试使用重复设置为NO,使用局部变量而不是属性,使用弱,强,赋值,保留......行为总是一样......第一次发射,从那之后发射。
非常感谢任何帮助......我是一名学习Objective-C的C#开发人员,因此对我来说一切都还是很陌生!提前谢谢。
UPDATE:这是设置主计时器的AppDelegate,它是setBtcValue的调用者:
#import "LBAppDelegate.h"
#import "LBBitStampCommunicator.h"
@implementation LBAppDelegate
@synthesize statusItem;
@synthesize statusItemViewController;
@synthesize bitStampManager;
@synthesize dataTimer;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
[self activateStatusMenu];
bitStampManager = [[LBBitStampManager alloc] init];
bitStampManager.communicator = [[LBBitStampCommunicator alloc] init];
bitStampManager.communicator.delegate = bitStampManager;
bitStampManager.delegate = self;
dataTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(fetchData) userInfo:nil repeats:YES];
}
- (void)activateStatusMenu {
NSStatusBar *bar = [NSStatusBar systemStatusBar];
statusItem = [bar statusItemWithLength:NSVariableStatusItemLength];
statusItemViewController = [[LBStatusItemViewController alloc]init];
[statusItem setView:statusItemViewController.view];
[statusItemViewController setBtcValue: 8888.88f];
}
- (void)didReceiveData:(LBTicker *)data {
[statusItemViewController setBtcValue:[data.last floatValue]];
}
- (void)fetchingDataFailedWithError:(NSError *)error {
[statusItemViewController setBtcValue:0.00f];
}
- (void)fetchData {
[bitStampManager.communicator getData];
}
@end
答案 0 :(得分:0)
你考虑过而不是试图产生一个计时器;以0.3秒的淡入效果制作动画?这样你只需要听取通知并启动动画,让系统完成剩下的工作。