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

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

ただいまの
回答率

87.92%

画面遷移後にTabBarが表示されなくなってしまう

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,986

score 82

いつもお世話になります。
現在、日記アプリを作っています。
日記編集画面からUINavigationController、timelaneViewControllerにつながった日記詳細画面に画面遷移するため、
以下のようにコードを書きました。

//ノート詳細画面へ飛ぶ
            let timeLine = self.storyboard?.instantiateViewControllerWithIdentifier("timeLine")
            let noteDetail = self.storyboard?.instantiateViewControllerWithIdentifier("noteDetail")
            let navigation:UINavigationController = self.storyboard?.instantiateViewControllerWithIdentifier("timeLineNavi") as! UINavigationController
            navigation.viewControllers = [timeLine!,noteDetail!]
            self.presentViewController(navigation, animated: true, completion: nil)


結果、画面遷移はうまくいくのですが、タイムラインと日記詳細画面のタブバーが表示されません。

以下がstoryBoradです。
タイムライン、日記詳細

日記編集画面

どのようにすれば、タブバーが表示する状態で画面遷移できますでしょうか。よろしくお願いします。

補足
質問がわかりにくくすみません!実現したい画面遷移はNoteViewController(写真二枚目)から日記詳細画面です。

教えていただいたサイトを参考に、コードを書いてみました。
NoteViewController.swift

//日記詳細画面へ飛ぶ
            let tabbar = self.storyboard?.instantiateViewControllerWithIdentifier("tabbar")as! TabBarController

            //1番目のタブのviewcontrollerを取得
            let vc:UINavigationController = tabbar.viewControllers![0] as! UINavigationController
            //一番目のタブを選択状態にする
            tabbar.selectedViewController = vc
            let timeline = self.storyboard?.instantiateViewControllerWithIdentifier("timeLine")
            let noteDetail = self.storyboard?.instantiateViewControllerWithIdentifier("noteDetail")
            vc.viewControllers = [timeline!,noteDetail!]

            vc.popToRootViewControllerAnimated(false)
            vc.viewControllers[0].performSegueWithIdentifier("toNoteDetail", sender: nil)


結果:画面遷移せず、エラーで落ちることもない。
メッセージ:
Unbalanced calls to begin/end appearance transitions for <„Åó_„ŵ_„Çì„Éé„ɺ„Éà.NoteDetailViewController: 0x16a4bb00>.

//日記詳細画面へ飛ぶ
            let tabbar = self.storyboard?.instantiateViewControllerWithIdentifier("tabbar")as! TabBarController

            //1番目のタブのviewcontrollerを取得
            let vc:UINavigationController = tabbar.viewControllers![0] as! UINavigationController
            //一番目のタブを選択状態にする
            tabbar.selectedViewController = vc
            let timeline = self.storyboard?.instantiateViewControllerWithIdentifier("timeLine")
            let noteDetail = self.storyboard?.instantiateViewControllerWithIdentifier("noteDetail")
            vc.viewControllers = [timeline!,noteDetail!]
            self.presentViewController(vc, animated: true, completion: nil)


結果:エラー
メッセージ
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present modally an active controller <„Åó_„ŵ_„Çì„Éé„ɺ„Éà.NoteViewController: 0x15fe2b80>.'

となってしまいます。
修正点などを教えていただけたら幸いです。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

質問のコードをどこの処理に書いたのかわからないので、どこの画面から日記詳細画面に遷移したいのか今ひとつわかりませんが、少なくともpresentViewControllerで遷移したら、UITabBarController管理下ではない別のモーダル画面として遷移するので、タブバーは表示されなくなります。

UITabBarController管理下の選択画面を切り替えたい場合は、UITabBarControllerのselectedViewControllerを設定することで指定画面に切り替えできます。

http://mako-wis.hatenablog.com/entry/2014/02/28/005459
の①、②を参考にするとよいと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/03 23:53

    ご回答いただき本当にありがとうございます!
    明日の朝一で教えていただいたページを参考に修正してみます。

    キャンセル

  • 2016/01/04 13:16

    教えていただいたサイトを参考にコードを書いてみましたが、エラーとなってしまいます。
    書いたコードを補足という形で追加しましたので、お手数ですが目を通して頂けないでしょうか。よろしくお願いします。

    キャンセル

  • 2016/01/04 15:52

    自分が書いたコードをどう修正したら意図通り動くようになるのかと聞いているのでしたら、全体的にどういう設計をしているのか今の説明では謎が多すぎるし、見えているコードもつっこみどころが多すぎるので、きちんと動かせるコードをアドバイスできる自信はありません。というか、あなたの代わりに全体の設計を理解して全部書き直してあげるつもりもありません。

    つっこみどころだけコメントします。
    ・let tabbar = self.storyboard?.instantiateViewControllerWithIdentifier("tabbar")as! TabBarController
    を実行すると新しいTabBarController(とその直下のviewController)のインスタンスを新しく生成します。
    もしすでに表示中のTabBarControllerがあり、そちらの表示に画面を戻したいのでしたら、新しいインスタンスを生成するではなく、元のTabBarControllerを表示するよう制御する必要があります。元のTabBarControllerを表示したいのか新しいTabBarControllerを表示したいのかわからないので、これ以上コメントできません。

    ・ let timeline = self.storyboard?.instantiateViewControllerWithIdentifier("timeLine")
    これは、TabBarController直下のViewControllerとして定義されていますので、前述のTabBar生成と一緒に生成されています。ここで新しく生成する意味がわかりません。設計意図と異なる不要な処理をしているような気がしますが、全体の設計を理解していないのでこれ以上コメントできません。

    ・ vc.viewControllers = [timeline!,noteDetail!]
    これは、参考URLのようにperformSegueWithIdentifierで遷移するよう設計を変更したのだったら不要だと思います。

    もう1つのコードの方は回答を無視してpresentViewControllerを実行していて、何がしたいのかわからないのでコメントできません。
    たぶん、紹介したサイトのコードの意味をちゃんと理解しないまま適当に真似して動くかどうか確かめているだけなのだと思います。画面遷移やインスタンス生成の意味を頭の中でイメージできるよう、入門書で一度勉強し直した方がよいと思います。その上で再度参考サイトを読んで意味を理解し、再設計するとよいと思います。

    キャンセル

  • 2016/01/05 10:09

    ご迷惑をおかけしました。
    回答や入門書などを読み、勉強し直します。
    ご回答いただきありがとうございました。

    キャンセル

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

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る