0

次のメソッドはクラッシュを引き起こします。UIはボタンのようなもので、NSTimerの開始/停止機能を処理します。タイマーが実行されると、UILabelが更新されます。viewDidLoadメソッドを使用するとタイマーが機能し、停止しても機能しますが、再度開始するとアプリがクラッシュします。

viewDidLoadメソッドでallocを削除し、スタートボタンを使用しようとすると、すぐにクラッシュします。でもNSLog(@"Start now");呼ばれていません。

コード:

- (void)tick {
NSLog(@"tick");
float value = [moneyLabel.text floatValue];
moneyLabel.text = [NSString stringWithFormat:@"%f", value + 1.0];

}

- (IBAction)startStopButtonClicked:(UIButton *)sender {
if ([sender.titleLabel.text isEqualToString:@"Start"]) {
    NSLog(@"Start now");
    if (timer) {
        NSLog(@"Timer valid");
        [timer fire];
    } else {
        NSLog(@"Timer is nil");
        timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(tick) userInfo:nil repeats:YES];
        [timer fire];
    }

    NSLog(@"bla");

    [sender setTitle:@"Stop" forState:UIControlStateNormal];
} else {
    [timer invalidate];
    timer = nil;
    NSLog(@"Stopped.");
    NSLog(@"Timer isValid: %@", timer);
    [sender setTitle:@"Start" forState:UIControlStateNormal];
}
}
4

2 に答える 2

3

電話をかける必要はまったくありません[NSTimer fire]。タイマーがいつ発砲するかを決定できるようにするのに十分なはずです。

まず、それがオブジェクトのインスタンス変数である場合はそうであることを確認しますが、明示的にinに設定してtimerも問題はありません。nilnil- (id)init

次に、タイマー自体の状態を使用して、ボタンのテキストではなく、開始/停止が押されたかどうかを判断します。

- (IBAction)startStopButtonClicked:(UIButton *)sender
{
    if (timer != nil)
    {
        NSLog(@"Stopping timer");
        [timer invalidate];
        timer = nil;
    }
    else
    {
        NSLog(@"Starting timer");
        timer = [NSTimer scheduledTimerWithTimeInterval:1
                                                 target:self
                                               selector:@selector(tick)
                                               userInfo:nil
                                                repeats:YES];
    }

    [sender setTitle:(timer != nil ? @"Stop" : @"Start")
            forState:UIControlStateNormal];
}
于 2012-05-04T08:27:30.387 に答える
0

投稿したコードは希望どおりに機能します。新しいプロジェクトでテストしただけなので、問題は別の場所にある可能性があります。NSTimer *timer;で初期化せずにivarを宣言するviewDidLoad:か、指定された初期化子を使用してテストしました...

于 2012-05-04T08:41:40.700 に答える