2013年8月12日月曜日

NSDateを使って残り時間を表示する

NSDateを使って残り時間を表示するプログラムを書きました。個人的に必要になるもので今後のためにメモします。

環境

  • Xcode: 4.6.2
  • iOS SDK: 6.1
  • プロジェクト: Single View Application

完成図



NSDateを使って残り時間を表示する

ViewController.m

#import "ViewController.h"

@interface ViewController ()
{
    UILabel *_timeLabel;  // 残り時刻を表示するラベル
    int _oneDayTmp;  // 一日を秒単位で格納するための変数
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // はじめに押すボタン(firstDateメソッドを呼びたいため今回はUIButtonクラスを使用している)
    UIButton *firstBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    firstBtn.frame = CGRectMake(10, 10, 100, 30);
    [firstBtn setTitle:@"first" forState:UIControlStateNormal];
    [firstBtn addTarget:self action:@selector(firstDate) forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:firstBtn];
    
    // 2回目以降に押すボタン(secondDateメソッドを呼びたいため今回はUIButtonクラスを使用している)
    UIButton *secondBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    secondBtn.frame = CGRectMake(150, 10, 100, 30);
    [secondBtn setTitle:@"second" forState:UIControlStateNormal];
    [secondBtn addTarget:self action:@selector(secondDate) forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:secondBtn];
    
    // 残り時刻を表示するラベル
    _timeLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 100, 300, 200)];
    [self.view addSubview:_timeLabel];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)firstDate
{
    // 一日を秒単位で格納
    _oneDayTmp = 86400;
    
    NSDate *date = [NSDate date];
    [[NSUserDefaults standardUserDefaults] setObject:date forKey:@"date"];
}

-(void)secondDate
{
    NSDate *now = [NSDate date];
    int tmp = [now timeIntervalSinceDate:[[NSUserDefaults standardUserDefaults] objectForKey:@"date"]];  // (1)
    
    int passTime;
    
    passTime = _oneDayTmp - tmp;  // (2)
    int ss = passTime % 60;
    int mm = (passTime - ss) / 60 % 60;
    int hh = (passTime - ss - mm * 60) / 3600 % 3600;

    _timeLabel.text = [NSString stringWithFormat:@"あと %02d:%02d:%02d でなにかが起こります。", hh, mm, ss];
}

@end
firstDateメソッドをはじめに呼び、その後はsecondDateメソッドを毎回呼ぶようにします。そうすればいい感じに動きます。今回はUIButtonクラスを使用しましたが同じ処理ができるならなんでも大丈夫です。

ポイントは(1), (2) です。

(1) tmpに入ってくる値は経過時間(秒単位)が入ってきます。
(2) 24時間(秒単位 86400秒)から(1)で取得した経過時間を引き、時間の差を求めます。

あとはそれぞれ、"時分秒"に直し残り時間を求めてUILabelクラスで表示しています。

参考記事

経過時間をTIME(HH:mm:ss)形式で表示する - PLUS

0 件のコメント:

コメントを投稿