「5秒後に画面遷移する」という仕組みをSwiftで実装してみる。


タイトルのような仕組みを実装してみたいと思います。
「制限時間60秒で◯◯をクリアしろ!」みたいなゲームとかで使えそうですね。
クリアできなかったらゲームオーバー画面に遷移する、みたいな感じです。

前回のボタンをタップした時じゃなくて好きなタイミングで画面遷移したい!で紹介した
「Manual Segue」の方法を用います。

画面は前回までと同様に、最初の画面がピンク色の画面で遷移後の画面が緑色の画面とします。
そして「Manual Segue」の設定はすでに終えているものとします。(前回の手順2までが終了している
状態です。セグエのIdentifierも「toGreen」と、同じものにしています。)

NSTimerの使い方

「◯◯秒後」といった時間経過後に何かしらのアクションを組み込むにはタイマーを使用します。
具体的にはNSTimerクラスの、scheduledTimerWithTimeInterval(ti: NSTimeInterval,
target: AnyObject, selector: Selector, userInfo: AnyObject?, repeats: Bool)
メソッド
を使用します。引数は5つあります。
ti・・・何秒後に実行するかの秒数を指定します。
target・・・ここに指定されたオブジェクトに対して、次のselectorのメッセージを送ります。
selector・・・targetに送るメッセージを指定します。
userInfo・・・タイマーに付加するユーザー情報を指定します。
repeats・・・繰り返し行うかどうかを指定します。trueは繰り返し行い、falseは1回きりです。

引数の意味がよくわからないと思いますので、実際に例をみてみましょう。
「5秒後に何かを実行する」という場合は、以下のようなコードになります。

    var timer:NSTimer = NSTimer()
    timer = NSTimer.scheduledTimerWithTimeInterval(5.0,
                                                   target: self,
                                                   selector: "changeView",
                                                   userInfo: nil,
                                                   repeats: false)

(改行してもしなくてもどちらでももちろんOKです)

1行目でNSTimerクラスのオブジェクトを作成しています。
2行目でタイマーをセットしています。
ti・・・5.0秒後に、
target・・・selfに対して(このselfはPinkViewControllerクラスを表しています。)、
selector・・・changeViewのメッセージを送り、
userInfo・・・ユーザー情報はなにも付加せず、
repeats・・・繰り返さずに1度だけ実行する。
という動作になります。

targetとかselectorがイマイチわかりにくいですが、単純に
「5秒後に1回だけPinkViewControllerクラスのchangeViewメソッドを実行する」
と考えてもらえれば結構です。

performSegueWithIdentifier(identifier: String, sender: AnyObject?)メソッドの実装

「5秒後に1回だけPinkViewControllerクラスのchangeViewメソッドを実行する」
のですから、changeViewメソッド内に画面遷移のプログラムを記述してあげます。
前回説明したperformSegueWithIdentifier(identifier: String, sender: AnyObject?)メソッド
を組み込みます。

    func changeView() {
        self.performSegueWithIdentifier("toGreen", sender: nil)
    }

をPinkViewControllerクラス内に記述すればOKです。

pinkViewController.swift全容

最後に作成したコードを載せておきます

import UIKit

class PinkViewController: UIViewController {
    var timer:NSTimer = NSTimer()                                                      //追加
    
    override func viewDidLoad() {
        super.viewDidLoad()
        timer = NSTimer.scheduledTimerWithTimeInterval(5.0,                            //
                                                       target: self,                   //
                                                       selector: "changeView",         //
                                                       userInfo: nil,                  //
                                                       repeats: false)                 //追加
        // 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.
    }

    func changeView() {                                                                //
        self.performSegueWithIdentifier("toGreen", sender: nil)                        //
    }                                                                                  //追加
}

コードの記述はとても少ないですね。これだけで実装することができます。
皆さんもこのコードをいろいろアレンジして活用してみてください。

  • このエントリーをはてなブックマークに追加

PAGE TOP