質問: storyboard.instantiateViewController(withIdentifier: "irset") present(nextView, animated: true, completion: nil) // 本画面の終了 self.dismiss(animated: true, completion: nil) } ```
回答: こちらの公式ドキュメントによると、`self.dismiss`は`UIViewController`によって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ならばセグエのプロパティで設定できます。 アプリによって適切な遷移が変わってくるとおもうので、いろいろ試してみてくださいね。