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

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

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

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

9209閲覧

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

funkyfrea

総合スコア86

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/01/02 14:18

編集2016/01/04 04:15

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

swift

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

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

以下が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>.'

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

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

投稿2016/01/03 14:48

編集2016/01/03 14:52
TakeOne

総合スコア6299

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

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

funkyfrea

2016/01/03 14:53

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

2016/01/04 04:16

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

2016/01/04 06: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を実行していて、何がしたいのかわからないのでコメントできません。 たぶん、紹介したサイトのコードの意味をちゃんと理解しないまま適当に真似して動くかどうか確かめているだけなのだと思います。画面遷移やインスタンス生成の意味を頭の中でイメージできるよう、入門書で一度勉強し直した方がよいと思います。その上で再度参考サイトを読んで意味を理解し、再設計するとよいと思います。
funkyfrea

2016/01/05 01:09

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問