質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.37%

NSTimerの書き方

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 710

SwiftXcodeApp

score 27

Swiftの最新版でMacOSX用のAppを開発中です。

MacOS用のApp作成で
NSTimerを使用するにはどのようにしたらいいでしょうか?

設定する時間を決めてその後、「START Button」を押すことで
カウントダウンが始まるようにしたいです。

その時のNSTimerを書く位置と書き方を教えてください。

一応以下まではやりました。しかし出来ません...

import Cocoa

class ViewController: NSViewController {

    var canT = false
    var timer:NSTimer = NSTimer()

    func result() {
        MMin = MMin - 1
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }

    //以上でoverride終了

    func result(sender:NSTimer) {
        if (MMin == 0) {
            timer.invalidate()
        } else {
            if (MMin / 60 <= 9){

                if (MMin % 60 <= 9) {
                    MMMS.stringValue =
                        ("0\(MMin / 60):0\(MMin % 60)")
                    MMin = MMin - 1
                } else {
                    MMMS.stringValue = ("0\(MMin / 60):\(MMin % 60)")
                    MMin = MMin - 1
                }

            }else {
                if (MMin % 60 <= 9) {
                    MMMS.stringValue = ("\(MMin / 60):0\(MMin % 60)")
                    MMin = MMin - 1
                } else {
                    MMMS.stringValue = ("\(MMin / 60):\(MMin % 60)")
                    MMin = MMin - 1
                }
            }
        }
    }

    var TiMM = 0
    //メインの「分」
    var TiMS = 0
    //メインの「秒」
    var TiSM = 0
    //セット前の「分」
    var TiSS = 0
    //セット前の「秒」
    var TiMN = 0
    /*タイマーが動いてる?
      0 = 動いてない
      10 = 動いてる
    */
    var TiFirst = 0
    /*
     初めてスタートさせるの?
     0 = Yes!
     10 = No!
    */
    var MMin = 0
    //メインの計算用「タイマー」

    @IBOutlet weak var Tism: NSTextField!
    //セット用のフィールド「分」

    @IBOutlet weak var Tiss: NSTextField!
    //セット用のフィールド「秒」

    @IBOutlet weak var MMMS: NSTextField!

    @IBAction func TisAM(sender: AnyObject) {
        TiSM = TiSM + 1
        if (TiSM <= 9) {
        Tism.stringValue = "0\(TiSM)"
        } else {
        Tism.stringValue = "\(TiSM)"
        }
    }
    //セットタイムを1上げる「分」

    @IBAction func TisRM(sender: AnyObject) {
        if (TiSM > 0) {
        TiSM = TiSM - 1
            if (TiSM <= 9) {
        Tism.stringValue = "0\(TiSM)"
            } else {
                Tism.stringValue = "\(TiSM)"
            }
        }
    }
    //セットタイムを1下げる「分」

    @IBAction func TisAS(sender: AnyObject) {
        TiSS = TiSS + 1
        if (TiSS <= 9) {
        Tiss.stringValue = "0\(TiSS)"
        } else {
            Tiss.stringValue = "\(TiSS)"
        }
    }
    //セットタイムを1上げる「秒」

    @IBAction func TisRS(sender: AnyObject) {
        if (TiSS > 0) {
        TiSS = TiSS - 1
            if (TiSS <= 9) {
        Tiss.stringValue = "0\(TiSS)"
            } else {
                Tiss.stringValue = "\(TiSS)"
            }
        }
    }
    //セットタイムを1下げる「秒」

    @IBAction func StartBut(sender: AnyObject) {
        if (TiMN == 0) {
            if (TiFirst == 0) {
                MMin = (TiMM * 60) + (TiMS)
                canT = true
                TiMN = 10
                    timer = NSTimer.scheduledTimerWithTimeInterval(
                        1.0,
                        target:self,
                        selector: "result",
                        userInfo:nil,
                        repeats: canT)

            }//
        }
    }
    //スタートボタン

    @IBAction func ResetBut(sender: AnyObject) {
    }
    //リセットボタン

}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/05/27 17:26

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

0

func result()func result(sender:NSTimer)の2つの関数が定義されていますが、
selector: "result"と指定してタイマーを起動したら、タイムアウト発生時に呼ばれるのはresult()の方です。
result(sender:NSTimer)の方が呼ばれるようにしたかったら"result"ではなく"result:"と指定する必要があります。

もし問題としているところが違うなら、「出来ません」というのが、何を期待してどうできないのか具体的に説明してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/28 00:05

    "result:"にしましたが、Builtした後、Timerをセットする秒数をセットした後、
    Startを押すのですが、カウントダウンが始まりません。

    キャンセル

  • 2016/05/28 00:06

    また、
    func result(sender:NSTimer)
    を書く位置は上記の場所であっているのでしょうか?

    キャンセル

  • 2016/05/28 01:31

    「カウントダウンが始まりません」とのことですが、中の動きは確認したんでしょうか?
    ブレークポイントを設定してステップ実行したり、print()を埋め込んだりしてresult(sender:NSTimer)が呼び出されているかどうか、プログラム内部の動きを確認しましたか?
    こちらで"result:"に修正した場合の動きを確認したところ、タイムアウト発生でresult(sender:NSTimer)は呼ばれましたが、MMinが0なので、timer.invalidate()ですぐにタイマーを停止しているように見えました。TiMMやTiMSが0で初期化されたまま更新している形跡がないのは何か変な気もしますが、どういう意図の変数かもよくわからないし、そこまで聞かれてないので、それ以上デバッグしてあげるつもりはありません。
    func result(sender:NSTimer)を書く位置は別に問題ありません。

    キャンセル

  • 2016/05/30 18:27

    丁寧な解説をありがとうございます。
    TiMMなどの初期化の更新も確認してみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る