4

次のコードを使用して時間を表示しています...ビューコントローラーにスクロールビューがあります...ここでは、00:00.00 (mm:ss:SS) (分:秒:ミリ秒) で始まる時間を表示し、ミリ秒単位でインクリメントすることを目指しています、ミリ秒に基づく秒、秒に基づく分...しかし、75:00.00 (mm:ss:SS) から始まる時間を表示し、ミリ秒、秒、分を 00:00.00 (mm:ss) に減らしたい.SS)...どうすれば...?

私はすでに次のリンクのSOでこれを尋ねています.. NSTimer秒/ミリ秒単位で時間を減らします

mouseClickを離さずにスクロールビューをドラッグアンドホールドすると、時間が計算されない(バックグラウンドでも)コードに従います...以下のコードの変更を手伝ってください...

enter code here
@interface ViewController : UIViewController
{
    IBOutlet UILabel *time;
    NSTimer *stopWatchTimer;
    NSDate *startDate;
    NSTimeInterval secondsAlreadyRun;
}

- (void)reset:(id)sender;
- (void)onStartPressed:(id)sender; 
- (void)onStopPressed:(id)sender;


enter code here
-(void)showActivity:(NSTimer *)tim 
{
    NSDate *currentDate = [NSDate date];

    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:startDate];
    // Add the saved interval
    timeInterval += secondsAlreadyRun;
    NSDate *timerDate = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    static NSDateFormatter * dateFormatter = nil;
    if( !dateFormatter ){
        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"mm:ss.SS"];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]];
    }
    NSString *timeString=[dateFormatter stringFromDate:timerDate];
    time.text = timeString;

    //    [dateFormatter release];
}

- (void)onStartPressed:(id)sender 
{
    stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1/10 
                                                      target:self 
                                                    selector:@selector(showActivity:) 
                                                    userInfo:nil 
                                                     repeats:YES];
    // Save the new start date every time
    startDate = [[NSDate alloc] init]; // equivalent to [[NSDate date] retain];
    [stopWatchTimer fire];
}

- (void)onStopPressed:(id)sender
{
    // _Increment_ secondsAlreadyRun to allow for multiple pauses and restarts
    secondsAlreadyRun += [[NSDate date] timeIntervalSinceDate:startDate];
    [stopWatchTimer invalidate];
    stopWatchTimer = nil;

    //    [startDate release];
    //    [self showActivity:stopWatchTimer];
}
4

3 に答える 3

11

NSRunLoopCommonModes で実行するタイマーを登録する必要があります

stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1/10 
                                                  target:self 
                                                selector:@selector(showActivity:) 
                                                userInfo:nil 
                                                 repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:stopWatchTimer forMode:NSRunLoopCommonModes]; 
于 2012-04-22T06:29:41.240 に答える
5

タイマーは、特定の実行ループモードの実行ループでスケジュールされます。これらは、実行ループがこれらのモードの1つで実行されている場合にのみ起動できます。メソッドは+scheduledTimerWithTimeInterval:...、デフォルトモードでタイマーをスケジュールします。スクロールバーが操作されている間のイベントの追跡は、を使用しNSEventTrackingRunLoopModeます。適切なモードでタイマーをスケジュールする必要があります。

NSRunLoopCommonModesモードの仮想セットであるスケジュールを設定できます。実行ループはそのようなモードでは実行されませんが、そのセットのメンバーであるモードで実行されます。デフォルトのモードでありNSEventTrackingRunLoopMode、そのままそのセットに追加されNSModalPanelRunLoopModeます。

于 2012-04-21T13:32:19.350 に答える
1
IBOutlet UILabel * result;
NSTimer * timer;                
int currentTime;


- (IBAction) start;
- (IBAction) pause;
- (void)populateLabelwithTime:(int)milliseconds;

.mファイル

- (void)viewDidLoad 
{
    currentTime = 270000000; // Since 75 hours = 270000000 milli seconds
    // ..... some codes....
}
- (IBAction) start
{
    timer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES];
}

-(IBAction)pause
{
    [timer invalidate]; 
}

- (void)updateTimer:(NSTimer *)timer {
    currentTime -= 10 ;
    [self populateLabelwithTime:currentTime];
}
- (void)populateLabelwithTime:(int)milliseconds 
{
    int seconds = milliseconds/1000;
    int minutes = seconds / 60;
    int hours = minutes / 60;

    seconds -= minutes * 60;
    minutes -= hours * 60;

    NSString * result1 = [NSString stringWithFormat:@"%@%02dh:%02dm:%02ds:%02dms", (milliseconds<0?@"-":@""), hours, minutes, seconds,milliseconds%1000];
    result.text = result1;

}
于 2012-04-21T13:04:06.207 に答える