デジタル時計を作ってみよう。

初心者なら誰でも一度は作りますよね、これ。

タイマー割り込みで時刻表示する、ただそれだけの仕掛けです。後ろのたこルカなんて貼り付け固定ですし。

さて、ぼちぼちいってみましょうか。

オブジェクトの張り込み

まず、ストーリーボードに以下の2つを貼り付けて@interfaceにつなぎ、名前をつけます。

UITextField testfield1
UIImage image1
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *image1;
@property (weak, nonatomic) IBOutlet UITextField *clockfield1;

image1はプログラム中じゃ使わないんですけど、あとで遊ぶためには名前つけといたほうがいいです。なお、画像はプログラムでなく別のとこで指定します。

データ保存領域を作る。

タイマーと時刻、それからフォーマットを定義する場所を用意。本当はもっとスマートにやれるはずですが、あえてプロパティで実装しています。細かいパラメータは適当な教本をどうぞ。

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *image1;
@property (weak, nonatomic) IBOutlet UITextField *clockfield1;
@property NSTimer *tm;
@property NSDate *now;
@property NSDateFormatter *nowf;
@property NSDateFormatter *nowsec;
@property (nonatomic,copy) NSString *xsec;

タイマー割り込みを書く。

まず、タイマー生成部。

    _tm =
        [NSTimer scheduledTimerWithTimeInterval:0.2f
        target:self
        selector:@selector(night:)
        userInfo:nil
        repeats:YES ];

まだ肝心のnight本体がありませんね。以下に。

0.2秒ごとに呼ばれますが、 秒の位の変化がない場合は何もしません。

-(void)night:(NSTimer*)timer{
    _now = [NSDate date];
    NSString *dm = [_nowsec stringFromDate:_now];
    if(![dm isEqualToString:_xsec]){
        // 更新
        _xsec = dm;
        dm = [_nowf stringFromDate:_now];
        _clockfield1.text = dm;
    }
}

全リスト

実装部の全リストは以下の通り。

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *image1;
@property (weak, nonatomic) IBOutlet UITextField *clockfield1;
@property NSTimer *tm;
@property NSDate *now;
@property NSDateFormatter *nowf;
@property NSDateFormatter *nowsec;
@property (nonatomic,copy) NSString *xsec;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    _xsec = @"99"; // 初回は必ず生成されるように。
    _nowf = [[NSDateFormatter alloc] init];
    _nowsec = [[NSDateFormatter alloc] init];

    [_nowf setDateFormat:@"HH:mm:ss"];
    [_nowsec setDateFormat:@"ss"];
    // タイマーの生成例
    _tm =
        [NSTimer scheduledTimerWithTimeInterval:0.2f
        target:self
        selector:@selector(night:)
        userInfo:nil
        repeats:YES ];
}

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

-(void)night:(NSTimer*)timer{
    _now = [NSDate date];
    NSString *dm = [_nowsec stringFromDate:_now];
    if(![dm isEqualToString:_xsec]){
        // 更新
        _xsec = dm;
        dm = [_nowf stringFromDate:_now];
        _clockfield1.text = dm;
        NSLog(@"%@",_xsec);
    }else{
        // NSLog(@"ほむ?");
    }
}

@end