質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

10115閲覧

【Swift】画面遷移を複数回した後に、一気に最初の画面に戻りたい

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/02/28 09:37

画面遷移を複数回して後に、一気に最初の画面に戻りたいと思っています。

現在は以下の順番で画面遷移しております。
FirstViewController → SecondViewController → CollectionViewController

FirstViewControllerからSecondViewControllerへはstoryboardでsegueを設定して遷移しており、特にコードは書いておりません。

SecondViewControllerにはボタンを配置しており、ボタンをタップするとCollectionViewControllerに遷移します。
そのコードが以下になります。

swift

1 let collectionView:CollectionViewController = storyboard!.instantiateViewController(withIdentifier: "ThirdView") as! CollectionViewController 2 self.present(collectionView, animated: true, completion: nil)

ここまでは正常に動いております。

CollectionViewControllerでセルをタップしたら、一気に最初の画面に戻りたいので以下のように書いてエラーが出ました。

swift

1let vc = storyboard!.instantiateViewController(withIdentifier: "top") as! FirstViewController 2self.present(vc, animated: true, completion: nil)
// エラー内容 Warning: Attempt to present <test.FirstViewController: 0x13e619dc0> on <test.CollectionViewController: 0x13e612880> which is already presenting

FirstViewControllerから遷移してきて、まだFirstViewControllerが残っているのだと思いますが、解決方法がわかりません。
戻るときに最初に起動したときと同じように操作したいので、インスタンスなどは全て破棄できるなら破棄して、最初の画面に戻りたいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

3つ目の画面から最初の画面へのsegueを追加して、セルタップ時にperformSegueするとか

投稿2017/02/28 16:13

fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/03/01 09:04 編集

ご回答、ありがとうございます。 今回は別の方の回答で解決させていただきました。
guest

0

ベストアンサー

popToRootViewController(animated:)で最初のViewControllerまで戻れますが、CollectionViewControllerがModalのようなので、dismiss(animated:completion:)してからpopToRootViewController(animated:)を呼ばないといけないかも知れません。

UINavigationControllerを使用しない

3→2から2→1へ無理やり繋げてみました。
Swift3化したつもりですが、エラーが出たら適当に直して下さい。

戻るときのアニメーションについては、dismissのtrue/falseで調整して下さい。

SecondViewController

swift

1override func viewWillAppear(animated: Bool) { 2 super.viewWillAppear(animated) 3 if let presented = presentedViewController { 4 if type(of: presented) == CollectionViewController.self { 5 //CollectionViewControllerから戻ってきたときの処理 6 print("[2] dismiss!") 7 dismiss(animated: true) { 8 print("[2] dismissed.") 9 } 10 } 11 } 12}
CollectionViewController

swift

1@IBAction func tapped(sender: UIButton) { 2 print("[3] dismiss!") 3 dismiss(animated: true) { 4 print("[3] dismissed") 5 } 6}

投稿2017/02/28 10:28

編集2017/03/01 04:37
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/03/01 01:55

ご回答ありがとうございます。 popToRootViewControllerについて調べましたら、navigationControllerで使用できるメソッドだと思ったのですが、navigationControllerを追加して実現させるということでしょうか?
fuzzball

2017/03/01 02:32

あー、NavigationControllerは使ってないのですね。
退会済みユーザー

退会済みユーザー

2017/03/01 03:15

はい、使っておりません。 できれば現状のクラスのままでと考えておりましたが 今回の目的のためなら他の方法で行うよりも、NavigationControllerを使用するほうがいいですかね。
fuzzball

2017/03/01 04:39

回答に追記しました. >>NavigationControllerを使用するほうがいいですかね と思います。 ちなみに、私の環境(Xcode7+iOS9)では質問のコードでもwarningは出ませんでした。
退会済みユーザー

退会済みユーザー

2017/03/01 09:03

解決できました。 ありがとうございます。 時間が有るときに、NavigationControllerも試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問