2011-02-08 114 views
1

我有两种方法如下。一种方法(timerHit)可以获得当前播放歌曲的曲目持续时间,从中减去1并在日志中打印出来,然后再用该值更新标签。另一种方法(countDown)每秒重复调用timerHit方法,但似乎无法正常工作,因此NSLog语句可以正常工作并重复,因此每秒都会打印该值,但更新标签语句[duration setDoubleValue:trackDuration];不起作用。谁能帮我?Objective-C NSTimer更新标签不更新

- (void)countDown { 
    [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timerHit:) userInfo:nil repeats:YES]; 
} 

- (void)timerHit:(NSTimer *)p_timer 
{ 
    iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; 
    double trackDuration = [[iTunes currentTrack] duration]; 
    if(trackDuration <= 1 && [p_timer isValid]) 
     [p_timer invalidate]; 
    trackDuration--; 
    NSLog(@"%d", trackDuration); 
    [duration setDoubleValue:trackDuration]; 
} 

谢谢,萨米。

回答

0

假设持续时间是NSTextField的一个实例(谷歌搜索之后,这似乎是这种情况 - 我找不到NSLabel是一个现有的对象),试试这个;

[duration setStringValue:[NSString stringWithFormat:@"%d", trackDuration]]; 
+0

哈哈,几乎相同的答复,但我喜欢点符号更好。 :-) 旁注:是在主线程上执行定时器吗?我期望在主线程上执行需求,但对于NSTimer来说这似乎不是必需的。但是如果它在主线程上运行,iOS如何确保它始终被称为“及时”?或者,也许它不能保证在第二个想法。 – Krumelur 2011-02-08 16:33:54

+0

现在它甚至不显示任何内容,而且我得到错误NSTextField可能不会响应-setText。另外对不起,我忘了提及这是一个Mac OS X的应用程序没有和iPhone应用程序,所以标签是NSTextView的一个实例,而不是UILabel。 – Sami 2011-02-08 18:18:56

0

您需要设置标签的文本:

duration.text = [NSString stringWithFormat:@"%d", trackDuration]];