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

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

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

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

Swift

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

Q&A

解決済

1回答

10057閲覧

swift3で画面遷移で遷移元の画面を閉じる方法

yamayamak

総合スコア131

iOS

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

Swift

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

1グッド

1クリップ

投稿2017/05/02 00:27

編集2017/05/02 00:36

タップされた時にコードで画面遷移しているんですが、遷移元の画面を以下のようにdismissで閉じようとすると、遷移先の画面が閉じてしまいます。
遷移元の画面を閉じたいのですが、やり方がわかりません。

selfにUIViewController名を記載してもコンパイルエラーとなります。

どのようにして画面を閉じるかご教授願います。

// セルがタップされた時の処理 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("タップされたセルのindex番号: \(indexPath.row)") // 設定画面へ let storyboard: UIStoryboard = self.storyboard! let nextView = storyboard.instantiateViewController(withIdentifier: "irset") present(nextView, animated: true, completion: nil) // 本画面の終了 self.dismiss(animated: true, completion: nil) }
acevif👍を押しています

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

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

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

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

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

fuzzball

2017/05/02 00:31

質問の意味が分かりません。閉じようとして閉じることに何の問題があるのでしょうか?(閉じようとすることの是非はともかくとして)
yamayamak

2017/05/02 00:37

誤記でした。遷移元を閉じたいのですが遷移先が閉じてしまいます。遷移元の閉じた方をご教授いただきたいです。
acevif

2017/05/04 03:17

すみません、よく意図が分からないのですが、遷移後に遷移元を閉じたいのは、そもそもなぜなのでしょうか?
guest

回答1

0

ベストアンサー

こちらの公式ドキュメントによると、self.dismissUIViewControllerによってmodallyに表示されたUIViewControllerを閉じるとあります。
つまり、selfに対してdismissを呼べば、selfがmodallyに表示した遷移先が閉じるのは当たり前なのではないでしょうか。

対策としては、遷移元(Bとする)の遷移元(Aとする)に対してdismissを呼び、遷移元Bを閉じてもらうという方法があると思いますが、それではBから遷移先Cにmodallyに遷移していた場合、Bを閉じるとCも閉じてしまうと思います。

そもそもUIViewControllerはその子のUIViewControllerを閉じることに責任があるとありますから、子が親を閉じるが、子は閉じられたくない、という設計に問題があるのではないでしょうか。(それでは親が責任を果たさず閉じることになる)
それよりも、その設計を見直すのはどうでしょう。

たとえば、Show Detail (旧名Replace)セグエを使って置き換え遷移するとか、
あるいは、以下のように遷移元の遷移元が頑張るとか。

  • A -> B と遷移
  • Bでユーザーが操作を完了
  • B -> A と戻る
  • AはA -> Cと遷移させる

追記1
メニューならば、Aの画面の一部と考えて、

  • A -> B
  • B -> A
  • A -> C

という遷移がよさそうですね。

恥ずかしながら私も詳しくないのですが、iOSにはmodal遷移(modallyな遷移)とそうでない遷移(push等)があるようで、どちらの遷移かによって振る舞いが変わるようです。
遷移の種類は、Storyboardならばセグエのプロパティで設定できます。
アプリによって適切な遷移が変わってくるとおもうので、いろいろ試してみてくださいね。

投稿2017/05/04 09:28

編集2017/05/09 09:15
acevif

総合スコア59

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

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

yamayamak

2017/05/06 07:53

ありがとうございます。そもそも設計の問題かとも思っています。 よく理解していませんが、メニュー表示された一覧をタップして閉じて次の画面に遷移したいだけですが、メニュー表示は一時的な選択のため閉じたいと思っています。 そのような場合にはどのように設計するべきなのでしょうか? すみませんが、ご教授いただければ幸いです。
yamayamak

2017/05/07 14:49

A->B->C という感じで次々に進むような感じで設計を考えていました。 遷移元を閉じるという考え方はダメなようですので、 (1)Cまで終了すれば最後に全て戻っていくように閉じる (2)毎回Aに戻ってB,Cと個別に遷移する というような設計にしたいと思います。ありがとうございました。
acevif

2017/05/09 09:11

ベストアンサーありがとうございます。 解決しましたでしょうか。
yamayamak

2017/05/09 23:56

はい、今の遷移した後にselfを閉じるプログラムでは遷移先になってしまいますので、callbackで遷移先が閉じる場合に遷移元の閉じるを呼び出すようにしています。 A->B->C->D と続いていくのですが、ご指摘のように毎回Aに戻って処理するか、Dまで行って完了時にAまで全て閉じるかのどちらかだと思います。今回はD完了時にB,C,Dの全てを閉じるようにしました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問