0

UITabBarControllerを持つstoryboardを考えてみましょう。UINavigationControllerに埋め込まれたUIViewController(VCと呼ぶことができます)。私たちは、VCがナビゲーションバーにBarButtonItemsを持つことを望みます。このストーリーボードは、別のストーリーボード(別のナビゲーションコントローラーを持つ)からのプッシュセグによって提示されます。iOSストーリーボードの提示タブバーモーダルとXCodeの押し込み8

Xcodeではすべてが正常に見えますが、navigation bar does not change in VC at the runtimeです。しかし、私がこのストーリーボードをプッシュからモーダルに変えると、すべてがうまくいくようです。 IMHOそれはナビゲーションコントローラを埋め込むためですが、なぜ動作していないのかわかりません。それを法的に(プッシュで提示する)、痛みを伴わずにどのように修正するかは、参考になります。事前

答えて

0

おかげでだから私はあなたには、いくつかのあなたの問題を解決するためのコードが、あまりないを採用しなければならないと思います。私はこれをテストするテストプロジェクトを構築し、コードと共に画像を添付します。 まず、あなたが正しく理解したら、navigationControllerに問題の新しいストーリーボードをプッシュします。添付の画像を参照してください。 MainStoryboard

私はストーリーボードをプッシュしているという名前を付けました。それから、私のストーリーボードではプッシュという名前のセットアップがあります。 Push.storyboard

tabbarcontrollerの最初のビューコントローラでは、以下のコードを追加しました。明らかに、これは私たちをここに押し込んだナビゲーションコントローラを隠しています。コントローラ番号2を訪れたら、新しいナビゲーションコントローラとアイテムが表示されます。 tabbarcontrollerビューコントローラ1でナビゲーションコントローラを隠している場合は、何をしたいのではありません。読み続けて。

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    //or to unhide from returning the opposite ->self.parent?.navigationController?.isNavigationBarHidden = true 
    self.parent?.navigationController?.isNavigationBarHidden = true 
} 

あなたが最初のビューコントローラにナビゲーションコントローラを非表示にしたくなかったが、コントローラ2を訪問するとき、あなたのアイテムを表示したい場合は、あなたのviewWillAppearにこれを追加し、viewWillAppearで最初のコントローラ内からコードを変更真に偽に。

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    // Do any additional setup after loading the view, typically from a nib. 
    self.parent?.navigationController?.isNavigationBarHidden = true 
} 

これは、親ナビゲーションコントローラを、基本的にはあなたのナビゲーションコントローラを覆っていたものとして隠しています。上記のように親ナビゲーションコントローラは隠れています。これはまた、モーダルでプレゼンテーションが行われた理由です。あなたのナビゲーションコントローラは最初から隠されていました。お役に立てれば。

**編集 ナビゲーションコントローラをタブ2のビューコントローラにしたいが、バックボタンで戻ることができるようにタブ1の親を保つ場合は、代わりにviewWillAppearで設定することができますビューコントローラ1でこれのようにしてください。

//tabcontroller vc 1 
override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    self.navigationController?.isNavigationBarHidden = false 
} 

そして、バーの項目を持つタブコントローラビューコントローラ2ではこれを行うことができます。 // tabbarcontroller vc 2 with own navigationcontroller override func viewWillAppear(_アニメーション:Bool){ super.viewWillAppear(animated) self.parent?.navigationController ?.isNavigationBarHidden = }

最後にあなたが両方のコントローラに表示戻るボタンをしたいが、異なる右ボタンがviewWillAppear

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
     self.tabBarController?.navigationItem.setRightBarButton(UIBarButtonItem(barButtonSystemItem: .edit, target: self, action: #selector(FirstViewController.editSomthing)), animated: true) 
} 

でプログラムそれをしたい場合はtrue、あなたは他のコントローラでそれを削除したい場合は

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    self.tabBarController?.navigationItem.rightBarButtonItem = nil; 
} 

上記の両方の例では、親ナビゲーションコントローラを保持しているため、タブコントローラのビューコントローラをuinavigati内に埋め込む必要はありませんオンコントローラ。

viewWillAppearの親/非表示の親ナビゲーションコントローラも同様にしたい場合は、上記のコードのコンボを使用することもできます。これは、現在および将来選択するビュー階層に依存します。

+0

ニースですが、親ナビゲーションバーに戻るボタンも隠しています。だから、この解決策には何かがありません:) – gbread

+0

もっと自由を許すように答えを更新しました。アプリケーションのオーバーヘッドを減らすために、さまざまな組み合わせを使用する必要があり、ストーリーボードの変更が必要または必要になる可能性があります。 – agibson007

+0

あなたはこれに戻り、正しいテストとマーキングをしてくれたことを感謝します。多分私はなぜ多くの質問に答えることなく3年間行ったのだろう。 :) – agibson007

関連する問題