2

次のような 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 秒)。startTimer メソッドが有効で正しく呼び出されているかどうかを確認するために AlertView を挿入しました。ただし、時間ラベルの値を変更することはできません。

時間ラベルは毎秒更新されないのに、スコア ラベルはアクション時に更新されるのはなぜですか? ViewController にコードを含めずに更新する方法はありますか?

//注: 私のコーディングは 3 つのファイルに分割されます。appDelegate は画面を反転し、それらの間で値を送信します。私のviewControllersはウィンドウだけで、最後に、私のGameScreenクラスはすべてのプロセスを管理します。xib から、File's Owner が ViewController に接続され、ビューが GameScreen クラスに接続されます。

フィードバックをお寄せいただきありがとうございます。追加のコードが必要な場合はお気軽にお問い合わせください。

4

2 に答える 2

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
}
于 2011-11-22T12:29:00.077 に答える
0

私は醜いウォークアラウンドを経験しました。ある程度は機能しますが、恥ずかしすぎて共有できないほどひどい修正を行いました...

基本的に、ビューの読み込み時にタイマーを起動したいので、タイマーを直接ViewControllerに移動し、ViewControllerの-(void)viewDidLoadからGameScreenの-(void)startTimerへの呼び出しで動作させることができません。両方のメソッドを含む他のすべてのものは、ほとんど複製されています(OK、複製されていません。それらを起動するためにいくつかの変数を処理しているため、「ポリモーフィング」としましょう)。

私の GameScreen.m IBActions は、GameScreenViewController.m ではなく、私の GameScreen.m 内でのみ他のメソッドを起動できるようです。したがって、GameScreen.m でボタンの動作を処理し、GameScreenViewController.m で「自動」のものを処理するだけです。つまり、ユーザーの操作に依存しないものです。必要な入力/出力に応じていくつかの IBOutlets が複製されたので、現在は機能しているので、ボンネットの下に行かないと違いがわからないと思います...

フィードバックをお寄せいただきありがとうございます。

于 2011-11-24T09:32:38.947 に答える