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

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

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

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

Q&A

解決済

2回答

330閲覧

Tabbarのitem間での遷移で「whose view is not in the window hierarchy!」のエラーが出てしまいます。

masimasi

総合スコア32

Swift

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

0グッド

0クリップ

投稿2018/06/10 08:46

編集2018/06/10 13:50

Tabbarでページを3つ作って、
インスタグラムみたいに
真ん中のボタンをおしたら
投稿ページがモーダル表示される

みたいなものを作っております。

イメージ説明

投稿ページのモーダル表示まではできたのですが、
(その投稿ページにはnavigation controllerをembed in させて、
ナビゲーションバーの左ボタンにキャンセルボタンを作り
ナビゲーションバーの右ボタンにshare実行ボタンをおきました)

投稿を実行をしたら、topページに戻らせたいのですが
うまくいきません。
(3つのタブは1つ目はtopページで、2つめは投稿ページ、3つ目はmyPage。3つめのmyPageから投稿画面へ移動しても、投稿完了したら1つ目タブのtopページに自動で遷移させたい。そんなイメージです)
dismissしてモーダルを閉じたら、topページに遷移するというのを
めざして書いたのですが
whose view is not in the window hierarchy!

のエラーがでてしまいます。

tabbarcontrollerのidentiferにMainを設定してます

以下投稿ページの.swiftです。

import UIKit class ShareEventViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //キャンセルボタン self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "キャンセル", style: UIBarButtonItemStyle.plain, target: self, action: #selector(self.tappedCancel(sender:))) // Do any additional setup after loading the view. } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) //投稿ボタン self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "シェア", style: UIBarButtonItemStyle.plain, target: self, action: #selector(self.tappedShare(sender:))) } @objc func tappedCancel(sender: UIBarButtonItem) { self.dismiss(animated: true, completion: nil) } @objc func tappedShare(sender: UIBarButtonItem) { self.dismiss(animated: true, completion: { self.toMain() }) } func toMain(){ let storyboard: UIStoryboard = self.storyboard! let nextView = storyboard.instantiateViewController(withIdentifier: "Main") present(nextView, animated: false, completion: nil) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

dismissしてから遷移。がうまくいかないという気がしてるのですが
その観点で知らべてもうまくいきませんでした。

アドバイスをお願いいたします
よろしくお願いします

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

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

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

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

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

guest

回答2

0

インスタグラムがこの実装かわかりませんが、タブの真ん中にダミーのViewControllerをおいてタブ押下時に遷移をキャンセルして、投稿画面へ遷移すれば良いと思います。

カスタムクラスのUITabBarControllerを定義して、真ん中のセル(下のコードの場合はDummyViewController)が押された時にDelegateメソッドがよばれれるので、その中で真中のタブならば遷移をキャンセル(falseを返す)して、投稿画面への遷移のSegueを呼び出せば良いと思います。

swift

1import UIKit 2 3class CustomTabBarController: UITabBarController, UITabBarControllerDelegate { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 self.delegate = self 9 } 10 11 func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { 12 13 if viewController is DummyViewController { 14       // 遷移先がダミー画面(真ん中のタブ)なので投稿画面へ遷移して、タブの遷移はキャンセル 15 performSegue(withIdentifier: "ShareEventViewControllerへのSegue、Identifire", sender: nil) 16 return false 17 } 18 return true 19 } 20} 21

投稿2018/06/10 09:40

編集2018/06/10 23:25
_Kentarou

総合スコア8490

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

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

masimasi

2018/06/10 13:12

ダミー画面という概念を初めて知りました。ありがとうございます。 if viewController is DummyViewController の return falseは どのページ(右タブ画面など)から投稿画面へ飛んでも、投稿完了したら topページに戻されるのでしょうか? 質問を重ねてすみません、こちらで最後の質問とします。
_Kentarou

2018/06/10 13:36

> ダミー画面という概念を初めて知りました。 特に意味は無いけれど無いとタブが3つにならないので、、、 > どのページ(右タブ画面など)から投稿画面へ飛んでも、投稿完了したら topページに戻されるのでしょうか? 真ん中のタブが、タブの切替が行われないということです。 そしてそのままモーダルで投稿画面が開くのでそれを閉じると、開く前の画面に戻ります。(単に閉じるだけです。)
masimasi

2018/06/10 13:47

ありがとうございます。3つめのタブはmypageにするので、どのページから投稿ページへ行って投稿を実行しても自動でTopページ(タブ1)に戻るように頑張ってみます!!
_Kentarou

2018/06/10 14:11

そういう仕様なんですね。若干難しいとは思いますが頑張ってください????????、また分からなければ聞いてください。
guest

0

自己解決

dismissする前に 後ろのtabbarを操作すればよいという考えでやってみました。
tabbar 遷移 コード のサンプルをコピーしたところ
結果として以下の書き方でうまくいったのですが
なぜこれでうまくいくのかよくわからないです。

なぜこれで動くのでしょうか?不思議です。

とりあえず動きました

参考
https://qiita.com/fromage-blanc/items/f33be78405dfa9f79f30

// タブバーのインスタンスを取得 if let tabvc = UIApplication.shared.keyWindow?.rootViewController as? UITabBarController { //左から0番目のタブアイコンを選択状態にする(0が一番左) DispatchQueue.main.async { tabvc.selectedIndex = 0 } } //移動先ViewControllerのインスタンスを取得(ストーリーボードIDから) let storyboard = UIStoryboard(name: "Main", bundle: nil) let dstView = storyboard.instantiateViewController(withIdentifier: "MainTabBarController") self.tabBarController?.navigationController?.present(dstView, animated: true, completion: nil) self.dismiss(animated: true, completion: nil)

投稿2018/06/13 03:37

編集2018/06/13 10:15
masimasi

総合スコア32

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問