Objective-C:在屏幕上重绘对象

时间:2011-11-22 12:17:18

标签: objective-c view timer refresh updating

我有一个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类。

非常感谢您的任何反馈,请随时询问所需的任何其他代码。

2 个答案:

答案 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,所以我想,因为它现在正在工作,如果你不进入引擎盖,你就无法区分......

感谢大家的反馈。