[Swift]Unwind Segueの処理の切り分け方法
こんにちは、プログラマーの@Yuuです。
前回の記事([Swift]Segueを使って複数の画面に値渡しをする)で遷移する時(Segue)の処理の切り分け方法は解説しましたが、じゃあ前の画面に戻った時(Unwind Segue)の処理を切り分けるにはどうしたらいいの(´・ω・`)?
というのを今回の記事でご紹介します。
スポンサーリンク
解説を行う前に
解説を行う環境は以下のとおりです。
- OS:OS X El Capitan10.11.5
- Xcode:7.3.1
- Swift:2.2
今回の解説では、前回作ったプロジェクトを使用します。
前回作ったプロジェクトは以下のような構成で
以下のような挙動をするものでした。
今回の終着点はSecondViewControllerとThirdViewControllerからViewControllerに戻ってくる際、どちらのViewControllerから戻ってきたかを判定し、ViewControllerのLabelに表示するようにします。
プロジェクトを用意する
前回のプロジェクトはGitHubにソースコードがあるので、そちらからダウンロードして下さい。
meganedogYuu/DeliveryValueSegueSample: Segueを使って複数のVCに値渡しを行うサンプル
GitHubからダウンロードする方法が分からない人向けに、GitHubからプロジェクトをダウンロードする方法を2つご紹介します。
分かる人は読み飛ばしちゃって下さいね。
1. ZIPファイルをダウンロードする
先ほどのGitHubのページにアクセスし、「Clone or download」ボタンを押して「Download ZIP」を選択します。
ZIPファイルがダウンロードされるので解凍します。
解凍したフォルダ内に「DeliveryValueSegueSample.xcodeproj」というファイルがあるので、ダブルクリックすると前回作ったプロジェクトファイルを開く事が出来ます。
2. クローンする
ターミナルでプロジェクトを保存したいフォルダに移動しclone
します。
例えばデスクトップに新しいフォルダを作り、その作成したフォルダにclone
する方法は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 |
# デスクトップに移動 cd Desktop # フォルダを作成 mkdir unwindSample # 作成したフォルダに移動 cd unwindSample # プロジェクトをクローン git clone https://github.com/meganedogYuu/DeliveryValueSegueSample.git |
Unwind Segueの処理を切り分ける
今回は以下の3つの項目に分けて解説を行います。
- ViewControllerにLabelを配置
- Unwind SegueにIdentifierを設定
- Unwind Segueの処理を切り分ける
1. ViewControllerにLabelを配置
storyboardを開きViewControllerにLabelを配置します。
今回も僕はLabelが画面の真ん中下に表示されるようAutoLayoutを設定しましたが、AutoLayoutは設定しなくても問題なく動きます。
Assistant Editorを使用して配置したLabelをViewController.swiftに紐付けます。
Labelには戻ってくる前のViewControllerの名前を表示するので、beforeVcNameLabel
という変数名で定義してみました。
1 2 3 4 5 6 7 8 9 10 11 12 |
class ViewController: UIViewController { // 遷移先に渡す変数 let a = "ラーメン" let b = "うどん" /// Unwind Segueで戻ってきたVcの名前を表示するためのLabel @IBOutlet weak var beforeVcNameLabel: UILabel! ・・省略・・ } |
紐付けが終わった後、storyboardでLabelを選択すると紐付けができている事が確認出来ます。
2. Unwind SegueにIdentifierを設定
今回で1番重要な部分です。
というかSegueで値渡しをやったことがあり勘がいい人であれば、この部分読めばその先のやり方も分かっちゃうんじゃないかな?
storyboardを開きます。
SecondViewControllerをとりあえず選択します。
すると横の部分にUnwind Segueという項目があるので選択します。
Segueで値渡しを行った時と同じように「Identifier」が設定出来ますね。
そう、Identifierに名前を付けてUnwind Segueで戻ってきた時に呼ばれるメソッド内でIdentifierを使って処理を切り分ければいいだけなんです!
Segueの時とほぼ一緒!
SecondViewControllerのUnwind Segueに「backSecond」と付け、
ThirdViewControllerのUnwind Segueに「backThird」と付けます。
これでIdentifierの設定は終了。
3. Unwind Segueの処理を切り分ける
Unwind Segueで戻ってきた時にIdentifierを使って処理を切り分けます。
今回のプロジェクトですと「ViewController.swift」の最後に定義されている
returnToTop(segue: UIStoryboardSegue)
がUnwind Segueをしようした際に呼ばれるメソッドです。
このメソッドの引数で受け取っているsegue: UIStoryboardSegue
がSecondViewControllerとThirdViewControllerから戻ってくるUnwind Segueです。
そのためreturnToTop(segue: UIStoryboardSegue)
メソッドを以下のように書き換えることで処理を切り分ける事が出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/// この画面に戻ってくるようにするUnwind Segue @IBAction func returnToTop(segue: UIStoryboardSegue) { if segue.identifier == "backSecond" { //SecondViewControllerから戻ってきた場合 // Labelに表示 beforeVcNameLabel.text = "SecondVcから戻ってきました" }else if segue.identifier == "backThird" { //ThirdViewControllerから戻ってきた場合 // Labelに表示 beforeVcNameLabel.text = "ThirdVcから戻ってきました" }else { // どちらでもない遷移 } } |
これで実行してみると
無事実行出来ました!
(๑•̀ㅂ•́)و✧
今回作成したプロジェクトもGitHubに上げておいたので、必要があれば参照してみて下さい。
meganedogYuu/UnwindJudgmentSample: UnwindSegueの処理を切り分ける
編集を行ったViewController.swiftの全文は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
import UIKit class ViewController: UIViewController { // 遷移先に渡す変数 let a = "ラーメン" let b = "うどん" /// Unwind Segueで戻ってきたVcの名前を表示するためのLabel @IBOutlet weak var beforeVcNameLabel: UILabel! 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. } /// Segueで遷移する際のメソッド override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "goSecond" { //SecondViewControllerに遷移する場合 // SecondViewControllerをインスタンス化 let secondVc = segue.destinationViewController as! SecondViewController // 値を渡す secondVc.a = self.a }else if segue.identifier == "goThird" { //ThirdViewControllerに遷移する場合 // ThirdViewControllerをインスタンス化 let thirdVc = segue.destinationViewController as! ThirdViewController // 値を渡す thirdVc.b = self.b }else { // どちらでもない遷移 } } /// この画面に戻ってくるようにするUnwind Segue @IBAction func returnToTop(segue: UIStoryboardSegue) { if segue.identifier == "backSecond" { //SecondViewControllerから戻ってきた場合 // Labelに表示 beforeVcNameLabel.text = "SecondVcから戻ってきました" }else if segue.identifier == "backThird" { //ThirdViewControllerから戻ってきた場合 // Labelに表示 beforeVcNameLabel.text = "ThirdVcから戻ってきました" }else { // どちらでもない遷移 } } } |
あとがき
今回含め3回連続でSegue関係の記事を書いてみました。
記事を書くために3回プロジェクトを作りSegueを試したものの、
やっぱり自分はコードベースで遷移する方が好きだなぁ・・^^;
と思ってしまいました(笑)
Segueが決して使えないものというわけじゃなく、
「1つのstoryboardに1つのViewController」をモットーに作るから、Segueをそもそも設定出来ないというのが大きな理由です。
ではでは
今回はこの辺で!ヽ(•̀ω•́ )ゝ✧