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

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

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

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

Swift

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

Q&A

解決済

3回答

11937閲覧

rootViewControllerを差し替えるときに、以前のビューは破棄したい

Shichi7

総合スコア35

iOS

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

Swift

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

1グッド

2クリップ

投稿2018/09/19 07:03

編集2018/09/19 07:05

再質問です。Notificationを受け取った時にAppDelegateより直接画面遷移を行いました。

swift

1let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 2UIApplication.shared.keyWindow?.rootViewController = storyboard.instantiateInitialViewController()

そうすると、以前開いていたViewに、新しいrootViewControllerが重なります。
それを、新しくrootViewControllerを設定したら、それ以前の画面は破棄するようにしてしまいたいです。

どうしたらいいでしょうか?

下の画像は、左がMainView->NextViewへのModalでの遷移で、理想の見え方です。
右は、MainView->NextViewと開いた状態で、AppDelegateよりRootViewをMainViewに差し替えました。
ModalでMainView->NextViewに遷移するときに、以前開いていたNextViewが下に見えてしまっています。

イメージ説明

sakamotoyuya👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

古い画面を閉じてから差し替えればいいと思います。

Swift

1guard let window = UIApplication.shared.keyWindow else { return } 2let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 3if window.rootViewController?.presentedViewController != nil { 4 // モーダルを開いていたら閉じてから差し替え 5 window.rootViewController?.dismiss(animated: false) { 6 window.rootViewController = storyboard.instantiateInitialViewController() 7 } 8} else { 9 // モーダルを開いていなければそのまま差し替え 10 window.rootViewController = storyboard.instantiateInitialViewController() 11}

投稿2018/09/20 03:05

u39ueda

総合スコア950

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

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

Shichi7

2018/09/20 09:10

ありがとうございます。できたようです!
guest

0

swift

1guard let SVC = storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController else { 2 fatalError("SecondViewController does not exist") 3 } 4 5self.navigationController?.setViewControllers([SVC], animated: false)

これでrootViewControllerの差し替えできませんか?

投稿2018/09/19 07:09

xAxis

総合スコア1349

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

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

0

今、表示されている一番上のviewControllerを取得して、

swift

1extension UIApplication { 2 class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { 3 if let navigationController = controller as? UINavigationController { 4 return topViewController(controller: navigationController.visibleViewController) 5 } 6 if let tabController = controller as? UITabBarController { 7 if let selected = tabController.selectedViewController { 8 return topViewController(controller: selected) 9 } 10 } 11 if let presented = controller?.presentedViewController { 12 return topViewController(controller: presented) 13 } 14 return controller 15 } 16}

そのcontrollerからpresentすれば良さそうです。上のコードでは、navigationControllerだった場合に、presentだと多分うまく行かなそうですが…

swift

1let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 2let mainView: UIViewController = storyboard.instantiateInitialViewController()! 3if let topController = UIApplication.topViewController() { 4 topController.present(mainView, animated: false, completion: nil) 5}

投稿2018/09/19 07:39

Shichi7

総合スコア35

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

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

u39ueda

2018/09/19 09:37

これだと以前のビューを破棄するのではなく裏に隠しているだけな気がしますが。 これで解決したんでしょうか?
Shichi7

2018/09/20 02:30

確かにそうなんですが、見た目的にこれ以外ではうまくいかず… rootViewControllerを差し替えるだけでなく、その子ビューなどもクリアにする方法があるんでしょうか??
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問