2015年

7月

10日

Swift ラーメンタイマー Swift1,Swift3

NSTimer、一定間隔で何かを実行させたい場合や、指定した時間に実行させたい場合などに使用します。

 

Objective-Cの場合はこちら

ViewController.swift

Swift1 (Xcode 6.x) 

 

import UIKit

 

class ViewController: UIViewController {

 

    @IBOutlet weak var lbTimer: UILabel!

    

    let noodleTime: NSTimeInterval = 60 * 3  // カップラーメンの出来上がり時間 60×3

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }

 

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

 

    @IBAction func countDown(sender: UIButton) {

        

        // 背景色

        self.view.backgroundColor = UIColor.yellowColor()

        

        // タイマー生成、開始 1秒後の実行

        var tmr: Void = NSTimer.scheduledTimerWithTimeInterval(

            1.0,                              // 時間間隔

            target: self,                       // タイマーの実際の処理の場所

            selector: Selector("tickTimer:"),   // メソッド タイマーの実際の処理

            userInfo: nil,

            repeats: true)                      // 繰り返し

            .fire()

    }

 

    // タイマー処理

    func tickTimer(timer: NSTimer) {

    

        //NSLog(@"タイマー表示");

        

        // 時間書式の設定

        let df:NSDateFormatter = NSDateFormatter()

        df.dateFormat = "mm:ss"

        

        // 基準日時の設定 3分を日付型に変換

        var dt:NSDate = df.dateFromString(lbTimer.text!)!

        

        // カウントダウン

        var dt02 = NSDate(timeInterval: -1.0, sinceDate: dt)

        

        self.lbTimer.text = df.stringFromDate(dt02)

 

        // 終了判定 3分が00:00になったら isEqualToString:文字の比較

        if self.lbTimer.text == "00:00" {

            

            // バックアップ背景色の変更

            self.view.backgroundColor = UIColor.redColor()

            

            // タイマーの停止

            timer.invalidate()

        }

    }

 

}

Swift3 Xcode 8.1 コンバート記述

コンバートしたSwift3 AppDelegate

 

//

//  AppDelegate.swift

//  RamenTimerSwift

//

//  Created by MAEDAHAJIME on 2017/01/03.

//  Copyright (c) 2017 MAEDA HAJIME. All rights reserved.

 

//

 

import UIKit

 

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

 

    var window: UIWindow?

 

 

    private func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        // Override point for customization after application launch.

        return true

    }

 

    func applicationWillResignActive(_ application: UIApplication) {

        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.

        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.

    }

 

    func applicationDidEnterBackground(_ application: UIApplication) {

        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.

        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    }

 

    func applicationWillEnterForeground(_ application: UIApplication) {

        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.

    }

 

    func applicationDidBecomeActive(_ application: UIApplication) {

        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

    }

 

    func applicationWillTerminate(_ application: UIApplication) {

        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

    }

 

 

 

}

 

ViewController.swift3

コンバートしたSwift3 Timer.scheduledTimer修正済み

 

//

//  ViewController.swift3

//  RamenTimerSwift

//

//  Created by MAEDAHAJIME on 2017/01/03.

//  Copyright (c) 2017 MAEDA HAJIME. All rights reserved.

//

 

import UIKit

 

class ViewController: UIViewController {

 

    @IBOutlet weak var lbTimer: UILabel!

    

    let noodleTime: TimeInterval = 60 * 3  // カップラーメンの出来上がり時間 60×3

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }

 

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

 

    @IBAction func countDown(_ sender: UIButton) {

        

        // 背景色

        self.view.backgroundColor = UIColor.yellow

        

        // タイマー生成、開始 1秒後の実行

        let tmr: Timer! = Timer.scheduledTimer(

            timeInterval: 1.0,                              // 時間間隔

            target: self,                       // タイマーの実際の処理の場所

            selector: #selector(ViewController.tickTimer(_:)),   // メソッド タイマーの実際の処理

            userInfo: nil,

            repeats: true)                      // 繰り返し

            tmr.fire()

    }

 

    // タイマー処理

    func tickTimer(_ timer: Timer) {

    

        //NSLog(@"タイマー表示");

        

        // 時間書式の設定

        let df:DateFormatter = DateFormatter()

        df.dateFormat = "mm:ss"

        

        // 基準日時の設定 3分を日付型に変換

        let dt:Date = df.date(from: lbTimer.text!)!

        

        // カウントダウン

        let dt02 = Date(timeInterval: -1.0, since: dt)

        

        self.lbTimer.text = df.string(from: dt02)

 

        // 終了判定 3分が00:00になったら isEqualToString:文字の比較

        if self.lbTimer.text == "00:00" {

            

            // バックアップ背景色の変更

            self.view.backgroundColor = UIColor.red

            

            // タイマーの停止

            timer.invalidate()

        }

    }

 

}

GitHub RamenTimerSwift


▫️参考ページ

  

目 次

 

コメントをお書きください

コメント: 6
  • #1

    miki (火曜日, 03 1月 2017 07:38)

    プログラミング初心者です。今学校のプロジェクトでカウントダウンタイマーを作っているのですが、ラーメンタイマーはシンプルで素敵だと思ったので参考にさせていただきました!

    このアプリを作った時、Xcodeのバージョンは何でしたか? 私は今Version 8.1を使ってるのですが、全く同じコードを入力してもたくさんエラーが出てきてしまいます。自動的に直してくれるものがほとんどですが。

    .fire() の部分に Cannot convert value of type 'Void' (aka'()') to specified type 'Timer' と出てくるのですが、どうしたら直せるでしょうか?

    また、シミュレーターを起動させたところ、メインの画面までは開くのですがスタートボタンを押すとXcodeの画面に戻り、AppDelegateの

    class AppDelegate: UIResponder, UIApplicationDelegate {

    に Thread 1: breakpoint 1.1 という文字とともに緑でハイライトされます。接続は特に問題ないと思うのですが、他に解決策はありますか?

    質問ばかりですみません。お返事お待ちしております。

  • #2

    luke (火曜日, 03 1月 2017 08:29)

    コメントありがとうございます。
    Xcodeのバージョンについてですが、
    Swift1 (Xcode 6.x) 言語の開発基礎をまとめたページです。
    Swift3 (Xcode 8.x)は対応していません。
    Swift3 (Xcode 8.x)では動作しませんご了承願います。

    Swift3へのコンバート機能を使えればある程度のバージョンアップは可能かと思いますが全て変換してくれない場合があります。その場合には、解析しコード修正が必要です。
    申し訳ありませんが、今のところこのようなお答えしか出来ません。
    参考にならず申し訳ありません宜しくお願いします。

  • #3

    luke (火曜日, 03 1月 2017 08:56)

    Swift -> Swift3にコンバートできましたのでお知らせしておきます。
    AppDelegate、ViewControllerのコンバートした記述を上記に記述していますので参考にしてください。

    Swift3 Xcode 8.1 ViewControllerコンバートした記述を一部修正した箇所を下記にしておきます。
    これで動作していますので試してみてください。
    宜しくお願いします。

    // タイマー生成、開始 1秒後の実行

    @IBAction func countDown(_ sender: UIButton) {

    // 背景色
    self.view.backgroundColor = UIColor.yellow

    // タイマー生成、開始 1秒後の実行
    let tmr: Timer! = Timer.scheduledTimer(
    timeInterval: 1.0, // 時間間隔
    target: self, // タイマーの実際の処理の場所
    selector: #selector(ViewController.tickTimer(_:)), // メソッド タイマーの実際の処理
    userInfo: nil,
    repeats: true) // 繰り返し
    tmr.fire()
    }

  • #4

    luke (火曜日, 03 1月 2017 09:02)

    Swift -> Swift3にコンバート方法ですが、ダウウロードしたRamenTimerSwift.xcodeprojをXcode 8.1にかぶせるとコンバートのメッセージが出てきますのでコンバートを実行してください。

    もう一つの方法ですが、Xcode 8.1 一から作りViewControllerの記述を利用すれば良いでしょう。
    この程度で申し訳有りませんが試してみてください。
    宜しくお願いします。

  • #5

    luke (火曜日, 03 1月 2017 09:21)

    参考にしたページです。
    Swift 3.0でTimerを利用して定期的に処理を実行する方法 - Qiita
    http://qiita.com/kaorumori/items/c923dea8a0324e9256b1

  • #6

    miki (火曜日, 03 1月 2017 19:18)

    ご丁寧な回答、ありがとうございました。無事、解決することができました。
    これからの投稿も楽しみにしています!