60840


以下のような画面を持ったiPhoneアプリを作りたいと考えています。

[![画像の説明をここに入力](https://i.stack.imgur.com/3Yci8.png)](https://i.stack.imgur.com/3Yci8.png)

この中のFirstViewから、SecondViewの次の画面の「ここに直接飛びたい」（以下、ターゲット画面）というところに遷移させたいです。

FirstViewの「移動」ボタンからSegueでターゲット画面につなぐと、遷移はできますがTabBarが表示されなくなります。  
FirstViewに、

[code]

    tabBarController?.selectedIndex = 1
    
[/code]

と書けばSecondViewには遷移しますが、ターゲット画面への遷移はできません。

このような場合、どのような処理でターゲット画面へ遷移することが一般的なのでしょうか。  
ご教示頂けますと幸いです。  
よろしくお願いいたします。


CC BY-SA 4.0
2019-11-25T03:25:31.553
60815
2019-11-26T13:40:28.183
14346
question
swift ios xcode iphone
tabBarをまたいで他のタブの下層ページに遷移したい


### どのような処理でターゲット画面に遷移することが一般的なのか?

このような遷移自体が一般的ではないため、一般的な処理方法というのもありません。

ご存知かと思いますが、iOSでは通常の画面遷移も、`UINavigationController`内の画面遷移も、スタック状に管理されており、ツリー構造になっています。別の枝の途中に直接遷移する、なんてことはサポートされていません。

iOS用のアプリを作成されるなら、マルチウインドウのPC用アプリや、Webアプリでの感覚を引きずらずに、iOSに適した画面遷移となるよう、設計を見直すことをお勧めしておきます。

以下に「見かけは動いているように見せられるけど」と言う回答をお示ししますが、詳細な挙動を調べてもらえれば、あなたのアプリには採用できないようなものであるかもしれません。そのような場合には、あなたのアプリではどのような動作をさせたいのかの詳細をご質問に追記してみてください。

### `tabBarController?.selectedIndex = 1`と書いてもターゲット画面に遷移できない

`UITabBarController`的にみると、`selectedIndex = 1`のview
controllerは、SecondViewController (今回の問題には本質的ではないですが、iOSプログラミングではviewとview
controllerは共に大変重要な要素なので、view
controllerを〜Viewと呼称することはやめた方が良いでしょう)ではなく、`UINavigationController`なので、その`UINavigationController`に「ターゲット画面に遷移させておく」と言うことは、出来なくはありません。

[code]

        @IBAction func 移動1Action(_ sender: Any) {
            guard let storyboard = self.storyboard else {
                print("Storyboard not used")
                return
            }
            let targetVC = storyboard.instantiateViewController(withIdentifier: "ここに直接行きたい")
            if let navVC = self.tabBarController?.viewControllers?[1] as? UINavigationController {
                if !(navVC.topViewController is ここに直接行きたいVC) {
                    navVC.pushViewController(targetVC, animated: false)
                }
            }
            self.tabBarController?.selectedIndex = 1
        }
    
[/code]

一体なぜこのような画面遷移が必要になるのか、目的をはっきりさせれば、より良い回答が得られるでしょう。


CC BY-SA 4.0
2019-11-25T22:30:58.000
60840
2019-11-26T13:40:28.183
2019-11-26T13:40:28.183
13972
13972
60815
answer