我有一个GameScreen.m文件(这是代码的简化部分):
- (IBAction) onCellClick:(id) sender
{
points +=1;
self.myScore.text = [[NSNumber numberWithInt: points] stringValue];
//myScore is a label in GameScreenViewController xib
}
也就是说,在单击视图中的单元格时,它会将文本标签增加1.到目前为止一直很好。
然后,在相同的代码中,我有一个计时器:
- (void) startTimer
{
[NSTimer scheduledTimerWithTimeInterval:1.0f
target:self
selector:@selector(updateCounter:)
userInfo:nil
repeats:YES];
}
其updateCounter方法是:
- (void) updateCounter:(NSTimer *)theTimer
{
int seconds;
static int count = 0;
count +=1;
timeElapsed = [[NSString alloc] initWithFormat:@"%d", seconds + count];
self.time.text = timeElapsed;
//time is a label in GameScreenViewController xib
}
在这种情况下,“时间”标签不会更新(每次1秒)。我已插入一个AlertView来检查startTimer方法是否有效并且是否正确调用,它实际上是(它每秒都显示一个烦人的警报视图,其中timeElapsed值)。但是,我可以'获取时间标签值进行更改。
为什么我的分数标签会根据操作进行更新,而时间标签不会每秒更新一次?有没有办法在不将我的代码包含在ViewController中的情况下更新它?
//注意:我的编码分为三个文件:appDelegate翻转屏幕并在其中发送值;我的viewControllers只是windows,最后,我的GameScreen类管理所有进程。从xib,File的Owner连接到ViewController,视图连接到GameScreen类。
非常感谢您的任何反馈,请随时询问所需的任何其他代码。
答案 0 :(得分:0)
您必须在主线程中执行此操作(与UI相关的操作)。
而不是行,
self.time.text = timeElapsed;
执行以下操作:
[self.time performSelectorOnMainThread:@selector(setText:) withObject:timeElapsed waitUntilDone:NO];
修改强>
- (void) updateCounter:(NSTimer *)theTimer
{
//int seconds;
static int count = 0;
count +=1;
NSString *timeElapsed1 = [[NSString alloc] initWithFormat:@"%d", count];
[self.time performSelectorOnMainThread:@selector(setText:) withObject:timeElapsed1 waitUntilDone:NO];
[timeElapsed1 release];
//time is a label in GameScreenViewController xib
}
答案 1 :(得分:0)
我经历了一次UGLY漫步。它在某种程度上起作用,但我经历了这样一个蹩脚的修复,我太尴尬了,无法分享......
基本上,我将我的计时器直接移动到ViewController,因为我希望它在视图加载时被触发,并且无法使用ViewController的调用 - (void)viewDidLoad到GameScreen的 - (void)startTimer。所有其他涉及这两种方法的东西,几乎都是重复的(好吧,不重复,让我们说'多态',因为我处理一些变量来解雇它们)。
似乎我的GameScreen.m IBActions只能在我的GameScreen.m中触发其他方法,而不是在GameScreenViewController.m上。因此,我在GameScreen.m上处理我的按钮行为,在GameScreenViewController.m上,我只处理'自动'的东西;也就是说,任何不依赖于用户交互的东西。它让我根据所需的输入/输出重复了一些IBOutlets,所以我想,因为它现在正在工作,如果你不进入引擎盖,你就无法区分......
感谢大家的反馈。