Xcode
iOS
Swift

【Swift】コードを使った二つの画面遷移の方法

最近元気がありませんm(><)m
こんにちはTOSHです。
今回は、アプリ開発の基本でもある画面遷移について紹介していこうと思います!

基本的な遷移の方法

Xcodeで画面遷移(アプリ内で画面を移動すること)際には、segueでボタンとパーツをつなげるのが一般的だと思います(下記参照)。

この方法は最も一般的で便利であるとは思いますが、例えば

  • パスコードを入力して画面遷移をしたい
  • 何回タップしたら遷移するといった
    場合ではこのような方法では実装できないのでまた別の方法で実装する必要があります。

コードを使った画面遷移(2通り)

  • viewControllerとviewController同士をsegueでつなぎ、そのsegueを遷移したいタイミングで呼び出す(TypeA)
  • 遷移したいviewController自体に名前、識別IDをつけて遷移したいタイミングでviewControllerそのものを呼び出す

の2通りがあります。個人的には上の方法の方が楽かなって感じです。下の方法だと、他のstoryboardのviewControllerに行く時に役立つのかな?

任意のタイミングでsegueを呼び出す(TypeA)

1. まず、移動前のviewControllerと移動したいviewControllerをsegueでつなぎます。

2. segueにIdentifierをつけます(segueを認識させるために名前をつけるような感じ!)

2.png
今回は、toSecondと名付けました。

3. 次はコーディングをしていきます

今回は二回タップした場合のみ移動するという条件でやってみましょう!
ちなみに、移動し呼び出すときのコードは、

self.performSegue(withIdentifier: "先ほど名づけたsegueのidentifier", sender: nil)

で遷移することができます。
先程の条件で動かすためには、

var counter = 0

@IBAction func move1(_ sender: Any) {

        counter = counter + 1
        print(counter)

        if counter == 2{
            self.performSegue(withIdentifier: "toSecond", sender: nil)
            counter = 0
        }
}

のように書いてあげれば、無事遷移します。

任意のタイミングでviewControllerを呼び出す

1. まずは、遷移したいviewControllerに名前をつけます

名前をつける際にはsegueの場合と同様に、Identifierをつける感じです!
スクリーンショット 2017-10-28 1.13.00.png
今回はsecondと名付けました。

2. コーディングしていきます。

コードを書く内容は、

//まずは、同じstororyboard内であることをここで定義します
let storyboard: UIStoryboard = self.storyboard!
//ここで移動先のstoryboardを選択(今回の場合は先ほどsecondと名付けたのでそれを書きます)
let second = storyboard.instantiateViewController(withIdentifier: "second")
//ここが実際に移動するコードとなります
self.present(second, animated: true, completion: nil)

これだけで完了です!最初の一行を少し変えれば他のstoryboardのviewControllerへと移動できるような気がします。

注意点

このコードを書く時は、全てこれらのコードを@IBAction funcの中に書いてください!
例えば、

@IBAction func move2(_ sender: Any) {
        let storyboard: UIStoryboard = self.storyboard!
        let second = storyboard.instantiateViewController(withIdentifier: "second")
        self.present(second, animated: true, completion: nil)
}

このような感じです。もしも、これを

let storyboard: UIStoryboard = self.storyboard!
let second = storyboard.instantiateViewController(withIdentifier: "second")

@IBAction func move2(_ sender: Any) {
        self.present(second, animated: true, completion: nil)
}

のように書いてしまうと、エラーが発生してしまいます。これはどうやら指定されている語のstoryboardという名前で定数を定義できないといった意味のようなものなのですが、なぜIBActionの中ではよくて外ではダメなのかよくわかりませんが...(誰か知っている人がいたら教えていただけるとありがたいです!)

おまけ

一つ前の画面に戻るときの遷移のコード

矢印でもう一回繋いで戻ることも可能ですが、それでは実際に戻っているのではなく新しく画面を立ち上げる動作であるのであまりお勧めできません。
戻るときのコードは

self.dismiss(animated: true, completion: nil)

で戻ることができます!これだと立ち上がっていた現在の画面から新しい画面を立ち上げるのではなく、先ほど開いていたページへ戻るように遷移できます。

サンプルコード

sample2