[Swift]Unwind Segueの処理の切り分け方法

2016.06.18
Unwindで処理を切り分ける記事のアイキャッチ

こんにちは、プログラマーの@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する方法は以下のようになります。

Unwind Segueの処理を切り分ける

今回は以下の3つの項目に分けて解説を行います。

  1. ViewControllerにLabelを配置
  2. Unwind SegueにIdentifierを設定
  3. Unwind Segueの処理を切り分ける

1. ViewControllerにLabelを配置

storyboardを開きViewControllerにLabelを配置します。
Labelを配置

今回も僕はLabelが画面の真ん中下に表示されるようAutoLayoutを設定しましたが、AutoLayoutは設定しなくても問題なく動きます。

Assistant Editorを使用して配置したLabelをViewController.swiftに紐付けます。
Assistant Editorに切り替えるためのボタン

Labelには戻ってくる前のViewControllerの名前を表示するので、beforeVcNameLabelという変数名で定義してみました。

storyboardとコードを紐付ける

紐付けが終わった後、storyboardでLabelを選択すると紐付けができている事が確認出来ます。
Labelがコードと紐付いている

2. Unwind SegueにIdentifierを設定

今回で1番重要な部分です。
というかSegueで値渡しをやったことがあり勘がいい人であれば、この部分読めばその先のやり方も分かっちゃうんじゃないかな?

storyboardを開きます。
SecondViewControllerをとりあえず選択します。
すると横の部分にUnwind Segueという項目があるので選択します。
SecondVcのオブジェクトが表示される

UnwindのIdentifier設定場所

Segueで値渡しを行った時と同じように「Identifier」が設定出来ますね。
そう、Identifierに名前を付けてUnwind Segueで戻ってきた時に呼ばれるメソッド内でIdentifierを使って処理を切り分ければいいだけなんです!

Segueの時とほぼ一緒!

SecondViewControllerのUnwind Segueに「backSecond」と付け、
IdentifierにbackSecondと入力

ThirdViewControllerのUnwind Segueに「backThird」と付けます。
IdentifierにbackThirdと入力

これでIdentifierの設定は終了。

3. Unwind Segueの処理を切り分ける

Unwind Segueで戻ってきた時にIdentifierを使って処理を切り分けます。

今回のプロジェクトですと「ViewController.swift」の最後に定義されている
returnToTop(segue: UIStoryboardSegue)がUnwind Segueをしようした際に呼ばれるメソッドです。

このメソッドの引数で受け取っているsegue: UIStoryboardSegueがSecondViewControllerとThirdViewControllerから戻ってくるUnwind Segueです。
そのためreturnToTop(segue: UIStoryboardSegue)メソッドを以下のように書き換えることで処理を切り分ける事が出来ます。

これで実行してみると
戻る前の画面を判定出来るようになった

無事実行出来ました!
(๑•̀ㅂ•́)و✧

今回作成したプロジェクトもGitHubに上げておいたので、必要があれば参照してみて下さい。
meganedogYuu/UnwindJudgmentSample: UnwindSegueの処理を切り分ける

編集を行ったViewController.swiftの全文は以下のようになります。

あとがき

今回含め3回連続でSegue関係の記事を書いてみました。

記事を書くために3回プロジェクトを作りSegueを試したものの、
やっぱり自分はコードベースで遷移する方が好きだなぁ・・^^;
と思ってしまいました(笑)

Segueが決して使えないものというわけじゃなく、
「1つのstoryboardに1つのViewController」をモットーに作るから、Segueをそもそも設定出来ないというのが大きな理由です。

ではでは
今回はこの辺で!ヽ(•̀ω•́ )ゝ✧

Unwindで処理を切り分ける記事のアイキャッチ

この記事が気に入ったらいいね!
して最新情報をチェックしよう!

スポンサーリンク