読者です 読者をやめる 読者になる 読者になる

ViewControllerを閉じる方法 (Unwind Segueを使う)

ViewControllerを閉じる

今、自分で、iPhoneアプリを作っているのですが、

ボタンをタップした時、segueで遷移した先のViewControllerにて [登録]ボタンを押して、登録完了後に、現在、起動中の登録画面の ViewControllerを閉じて、元の遷移元の画面に戻る

みたいな実装をしてたんですが、遷移先のViewControllerで

self.dismissViewControllerAnimated(true, completion: nil) 

とか書いても、ViewControllerが閉じないんですよね。

参考先のサイト on Qiita ViewControllerを閉じる

理解が足りないなー、と。

まずは、画面を閉じる方法から。

割りと、[ViewController 閉じる] ってやっても、あんまり引っかからないんですね笑

ちょっと、書いてみました。

参考にさせて頂いた所

[Swift]初心者向け!Segueを使った画面遷移方法

いや、すげー、分かりやすかったです。ありがとうございます。

Unwind Segue

Using Unwind Segues By Apple

Appleの公式サイトからすると、 UnwindSegueってのは、PushとかのSegueから戻る一つの方法って感じですかね。

他にも方法がある、って事なのかな。

Close Sample

今回のソースを Github にあげてます。

[TakahashiIkki/CloseSegueSample @github]

作成方法

サンプルプロジェクトの作成

Single Page Applicationを選択します。 f:id:ikkitang1211:20160623234342p:plain

プロジェクト名をCloseSegueSampleとしました。 f:id:ikkitang1211:20160623234412p:plain

OrgnizationNameとか隠してるけど、Githubに上げてるなら意味ないのかな?笑

初回は、ViewControllerが一つだけある状態です。 f:id:ikkitang1211:20160623234611p:plain

遷移先ViewControllerの作成

まずは、 あるViewController から遷移する遷移先のViewControllerを作成していきます。

今回は、 ViewController から ToViewControllerへ移る事とします。

ToViewControllerクラスを定義します。

f:id:ikkitang1211:20160623235116p:plain

NewFileをクリックして、 f:id:ikkitang1211:20160623235217p:plain

Cocoa Classs から、ToViewControllerクラスをUIViewControllerを継承して作成します。

f:id:ikkitang1211:20160623235246p:plain

はい。出来ました。 f:id:ikkitang1211:20160623235331p:plain

必要な簡単なクラスとimportとかだけ整理しました。 f:id:ikkitang1211:20160623235505p:plain

InterfaceBuilder上でSegueを定義

InterfaceBuilder上で画面遷移を作成していきます。

画面遷移を作成するのは簡単です。

まず、Main.storyboardを開いて、ViewControllerを追加します。

この追加したのが、ToViewControllerになります。

f:id:ikkitang1211:20160624000526p:plain

View Controllerをドラッグして、 現在ある、ViewControllerの横に置きます。

f:id:ikkitang1211:20160624000642p:plain

置いたら、こんな感じになります。

わかりやすいように、遷移元のViewControllerを黄色に。 遷移先のToViewControllerを緑色にします。

f:id:ikkitang1211:20160624000811p:plain

f:id:ikkitang1211:20160624000835p:plain

また、忘れないように、遷移先のToViewControllerを先ほど作ったToViewControllerクラスと結びつくようにします。

f:id:ikkitang1211:20160624001418p:plain

次は、ボタンを作成していきます。

開くボタンをクリックすれば、ToViewControllerが開く。 というイメージです。

f:id:ikkitang1211:20160624001222p:plain

では、画面遷移を作成します。
controlボタンを押しながら、 開く をクリックして、 そのまま、 ドラッグして、ToViewControllerまでドラッグします。

f:id:ikkitang1211:20160624001737p:plain

このようなポップアップが出てくるので、 Show を選択します。

開くをクリックした時の遷移が作成出来ました。

f:id:ikkitang1211:20160624001814p:plain

戻る処理の作成

次は、 戻る処理を 作成していきます。

ここからが、 Unwind Segue の話です。

例によって、戻るボタンを作成します。

f:id:ikkitang1211:20160624002147p:plain

ここで、少し、コーディングします。

遷移元ViewControllerに 記述します。

※ ToViewController側に記述して、はまりました笑

f:id:ikkitang1211:20160624002601p:plain

@IBAction func returnToMe(segue: UIStoryboardSegue) { }

これだけです。
また、このメソッド名、 returnTome() とかじゃなくても何でもいいです。 引数と @IBAction の指定だけすればいいみたいです。

次に、戻るを押した時と、このreturnToMe() function を結びつけます。

Main.storyboard を開いて、ToViewController側を表示します。

戻る ボタンを control ボタンを押しながらクリックして、 ドラッグして、 ToViewControllerの上部の一番右にある Exit のアイコンに結びつけます。

f:id:ikkitang1211:20160624003016p:plain

また、ポップアップが出てくるので、 ここには、先ほど定義したメソッド名が表示されています。 先ほど定義した、 returnToMe() メソッドを指定します。

以上で、チェック完了です。

動作確認すると、以下の様な感じです。

動作チェック

初回起動時、ViewController が開きます。 開くをクリックします。 f:id:ikkitang1211:20160624003223p:plain

ToViewController が show segue で表示されました。 戻るボタンで戻ってみます。 f:id:ikkitang1211:20160624003235p:plain

スクリーンショットだとあまり説得力はありませんが、ちゃんと戻れました。 f:id:ikkitang1211:20160624003416p:plain

github のソースにあげています。

今回のソースを Github にあげてます。

[TakahashiIkki/CloseSegueSample @github]

ViewController を閉じる他の方法

NavigationControllerを使う方法は、まあ置いておくとして、他にあるんだろうか?

そもそも、

self.dismissViewControllerAnimated(true, completion: nil) 

なんで動かなかったんだろう?

Qiita読む限りは遷移先で呼ぶメソッドっぽいしなー。

って事でまだまだ、 Swifter には程遠いです。

。。。ってか、ブログなっがーー。。

書くので疲れた。