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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

4回答

550閲覧

iosアプリ開発で画面をまとめて閉じる

sena14

総合スコア109

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/06/18 21:14

A→B→C→Aと画面遷移するのですが、C→Aと画面遷移する際にB,Cを閉じることでAを表示させた方がいいとおもうのですが、まとめて閉じる方法が分からなくて困っています。
検索してみても一つの画面を閉じる方法ばかりヒットしてしまい見つけることができない状況です。
よろしくお願いします。

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

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

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

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

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

fuzzball

2018/06/19 02:36

C→Aの後も、B→C→A→... と延々ループ出来るのでしょうか?
fuzzball

2018/06/19 02:37

「C→Aに遷移」と「C→Aに戻る」は別物と考えて下さい。今回の場合は「遷移」でしょうか?「戻る」でしょうか?
sena14

2018/06/19 06:59

戻りたいです。
fuzzball

2018/06/19 07:02

ナビゲーションコントローラを使用しているかどうかと、遷移の方法を具体的に書いて下さい。
sena14

2018/06/19 07:24

ナビゲーションコントローラーは現状使用していませんが可能であれば使用したいと考えています。遷移方法はボタンからドラッグしてsegueのshowを設定しています。
guest

回答4

0

特にナビゲーションコントローラー等を使っていない場合ですと

swift

1/// 最初の画面に戻ります。 2self.view.window?.rootViewController?.dismiss(animated: true, completion: nil)

swift

1/// 一応これで最初のVCのインスタンスを取得できます。 2let rootVC = self.view.window?.rootViewController as! TESTViewController 3

投稿2018/06/19 15:58

bilieikbilibili

総合スコア37

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

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

sena14

2018/06/20 00:56

ありがとうございました。現状動作を確認できました。 ナビゲーションコントローラーを使った場合ですと何か方法はあるのでしょうか?
fuzzball

2018/06/20 01:03

それは_Kentarouさんの回答に書かれていますが。
sena14

2018/06/20 01:16

すみません。 まだModalについて調べられておらず分かるものから順番にお返事させていただいていました。
fuzzball

2018/06/20 01:23

ん?popToRootViewController(animated:)はModally用ではなくshow用(普通の横にスライドするやつ)です。
sena14

2018/06/20 01:42

_Kentarouさんの「閉じるというのはModalのことですかね。」 という箇所でModalというものが分かっていないため調べてからと思っていました。 すみません。ios端末自体持ったことがなく仕組みが全然分かっていません。 showとmodal?modally?について調べてきます。
guest

0

ベストアンサー

やるなら順番に閉じるのが無難かな、と。

Cは普通にdismiss(ボタン押したとき)

swift

1@IBAction func tapped(_ sender: UIButton) { 2 self.dismiss(animated: true) { 3 print("dismissed") 4 } 5}
Bは自動で閉じる

dismissは、Aから遷移してきたのか、Cから戻ってきたのかを判定するフラグです。(簡易に作っているので何か問題出るかも知れません)

swift

1class ViewControllerB: UIViewController { 2 var dismiss = false 3 override func viewDidAppear(_ animated: Bool) { 4 super.viewDidAppear(true) 5 if dismiss { 6 self.dismiss(animated: true) { 7 print("dismissed (auto)") 8 } 9 } 10 dismiss = !dismiss 11 } 12}

投稿2018/06/19 08:13

fuzzball

総合スコア16731

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

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

fuzzball

2018/06/19 08:15

まぁ、ナビゲーションコントローラを使う気があるのなら、使った方がいいと思います。
sena14

2018/06/20 01:02

B→Cに遷移するタイミングでtrueにして見たのですが消えずに困っています。 どんな動きになっているのか確認しようとしたのですが下記のような問題があり確認できずにいます。 https://teratail.com/questions/131992 CからBにも戻りたいので最終的にはCのAに戻るボタンが押されたタイミングでBのフラグを立てないといけないかと思うのですが、C内でBの変数を変更する方法はあるのでしょう? BをCに受け渡したりフラグ自体をBの変数ではなく新しくクラスを作ってそこで管理しB、Cでやり取りするしかないのでしょうか?
fuzzball

2018/06/20 01:05 編集

私のコードをそのままコピペするだけでいのですが。 (上のコードがC用、下のコードがB用) dismiss = !dismiss このコードでtrue/falseが切り替わりますので。
sena14

2018/06/20 01:36

super.viewDidAppear(true)を記述し忘れていて修正したところ閉じることができました。 この方法だとBが一瞬表示されてしまうんですね。 _Kentarouさんのご回答の方法でも下の画面が表示されてしまうとのことで、CからAに直接行くような見え方にはできないのでしょうか?
fuzzball

2018/06/20 01:51 編集

ナビゲーションコントローラを使わない今のやり方だと、真っ当な方法は思いつかないですね。 アニメーションが無くていいなら出来ますけどね。 私のコードの二箇所の animated: を false にすれば確認できます。
sena14

2018/06/20 02:01

なるほど。 ナビゲーションコントローラの勉強もしつつ教えていただいたこと整理してやってみます。 一旦まとめて閉じるという機能は確認できたのでベストアンサーとさせて頂きます。 ありがとうございました。 やって行くうちにまた質問させていただくかと思いますがタイミングが合えばよろしくお願いします。
guest

0

閉じるというのはModalのことですかね。

ナビゲーションだったら????

swift

1navigationController?.popToRootViewController(animated: true)

本来Modalの目的には一時的な画面で終わったら閉じるという動きが通常だと思います。
モーダルを重ねるUIにするのでしたら画面遷移のフローを見直すというのも考え方だと思います。

ですが、頑張ればできますのでコードを載せておきます。
※ ちょっと無理がありますので、アニメーションで閉じるときは下の画面が見えます、参考にしてみてください。

swift

1 2import UIKit 3 4class TopViewController: UIViewController { 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 } 10 11 @IBAction func dismiss(_ sender: UIButton) { 12 13 // 全てのモーダルを閉じる 14 dismissAll(animated: true) { 15 16 } 17 } 18} 19 20 21extension UIViewController { 22 func dismissAll(animated: Bool, completion: (() -> Void)?) { 23 24 var presentingViewController = UIApplication.shared.topViewController?.presentingViewController 25 guard let _ = presentingViewController?.presentingViewController else { 26 completion?() 27 return 28 } 29 30 while let presenting = presentingViewController?.presentingViewController { 31 presentingViewController = presenting 32 } 33 presentingViewController?.dismiss(animated: animated, completion: { 34 completion?() 35 }) 36 } 37} 38 39extension UIApplication { 40 var topViewController: UIViewController? { 41 guard var topViewController = UIApplication.shared.keyWindow?.rootViewController else { return nil } 42 while let presentedViewController = topViewController.presentedViewController { 43 topViewController = presentedViewController 44 } 45 return topViewController 46 } 47}

投稿2018/06/18 22:47

編集2018/06/18 23:37
_Kentarou

総合スコア8490

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

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

0

とある画面から、他の画面を閉じることができるなら、いくつでも閉じれるようになると思いますが

投稿2018/06/18 21:32

y_waiwai

総合スコア87749

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問