0

Xcode 4.2 で NSTimer を作成しましたが、動作しますが、この 1 つの問題が発生します。

これがシミュレーターでの私のプロジェクトです

シミュレーター

開始を押すと開始し、停止を押すと停止し、停止するとリセットされますが、開始すると何も起こらず、リセットを押すと、基本的に停止する必要があります。方法とこれまたはコードのコピーをどこにでも追加する必要がありますか。

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController {

    IBOutlet UILabel *time; 

    NSTimer *myticker;

    //declare baseDate
    NSDate* baseDate; 

}

-(IBAction)stop;
-(IBAction)reset;

@end

ここに私の実装があります

 #import "FirstViewController.h"

@implementation FirstViewController

@synthesize baseDate;


-(IBAction)start {
    [myticker invalidate];
    self.baseDate = [NSDate date];
    myticker = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(showActivity) userInfo:nil repeats:YES];
}

-(IBAction)stop;{ 

    [myticker invalidate];
    myticker = nil;

}



-(IBAction)reset {
    self.baseDate = [NSDate date];
     time.text = @"00:00:0";  
}


-(void)showActivity {
    NSTimeInterval interval = [baseDate timeIntervalSinceNow];
    double intpart;
    double fractional = modf(interval, &intpart);
    NSUInteger hundredth = ABS((int)(fractional*10));
    NSUInteger seconds = ABS((int)interval);
    NSUInteger minutes = seconds/60;

    time.text = [NSString stringWithFormat:@"%02d:%02d:%01d", minutes%60, seconds%60, hundredth];
}

ほんとうにありがとう。ありがとう。

4

1 に答える 1

2

まず、上記はメソッドに保持されていないshowActivityため、到達すると EXC_BAD_ACCESS でクラッシュするはずです。 自動解放されたオブジェクトを返すため、メソッドの後に無効な参照が含まれます。baseDatestart[NSDate date]baseDatestart

プロパティに変更baseDateしてから、次を使用して設定することをお勧めします。retainstartself.

//.h
@property (nonatomic, retain) NSDate *baseDate;

//.m
@synthesize baseDate;

-(IBAction)start {
    [myticker invalidate];
    self.baseDate = [NSDate date];
    myticker = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(showActivity) userInfo:nil repeats:YES];
}


この問題を解決するには、メソッドが の現在の値を使用して経過時間を計算し、ラベルを設定して書式設定して表示することresetに注意してください。showActivitybaseDatetime

このstartメソッドでは、baseDateを現在の時刻に設定し ( は設定しませんtime.text)、タイマーを開始します。その後showActivity、メソッドは発火し続け、設定されtime.textます。

このresetメソッドでは、リセットが押された時点からの経過時間の表示を開始するタイマーが必要です。タイマーはすでに実行されているため、再起動する必要はありません。ラベル テキストの設定はtime機能しません。既に実行されているタイマーが再びbaseDate起動すると、元の開始時間からの経過時間が計算され、それにtime.text基づいて設定されるためです。したがって、設定する代わりに、次のように設定time.textbaseDateます。

-(IBAction)reset {
    self.baseDate = [NSDate date];
}
于 2012-03-12T14:05:13.677 に答える