2016-09-01 10 views
1

私は、UINavigationControllerのビューコントローラ階層内にあるビューコントローラを作成しました。このビューコントローラには、子ビューコントローラのビューを表示するフルフレームコンテナビューが含まれています。ビューコントローラを押すことなく、UINavigationControllerのナビゲーション項目を置き換える方法はありますか?

コンテナビューを含むビューコントローラのナビゲーション項目ではなく、子ビューコントローラのナビゲーション項目(i.s. titleおよびrightBarButtonItems)に関連付けられた項目を表示することをお勧めします。

私の初期の反応は単にviewController.navigationItem = childViewController.navigationItemに設定されていますが、navigationItemは読み取り専用です。私の第二の反応は、例えば、関連する項目自体を設定するには:

viewController.navigationItem.title = childViewController.navigationItem.title; 
viewController.navigationItem.rightBarButtonItems = childViewController.navigationItem.rightBarButtonItems; 

をスウィズリングである、私はまた、子ビューコントローラのナビゲーション項目のプロパティが設定されているときを検出し、それに応じて更新することができますよ。ただし、子ビューコントローラのナビゲーション項目のプロパティが更新されずに更新された場合(titleはテキストの色が変更され、rightBarButtonItemは無効です)、これらの変更は反映されません。

私が探している効果を達成する方法はありますか?

答えて

0

こんにちは、childviewcontrollerのナビゲーション項目を設定する代わりに、parentviewcontrollerのナビゲーション項目を設定できます。

子供ビューコントローラをロードする前に、childviewcontrollerのnavigatioバーアイテム値を知っている場合、parentviewcontrollerのナビゲーションバーアイテムを設定することができます。

子ビューコントローラがコンテナ内にある場合、もう1つの質問があります。子ビューコントローラをロードする前に、親ビューコントローラのナビゲーションバーを設定する方がスクロール可能なので、独自のナビゲーションバーがあります。

0

私の問題は他の場所にあり、私の質問に概説されているアプローチが望みどおりに機能していることがわかります。 X_X

ここでは、この答えは、より有用にするためには、私のアプローチの詳細は以下のとおりです。

  • 私はUINavigationItemのカテゴリを作成し、マット・トンプソンのチュートリアル(http://nshipster.com/method-swizzling/)を用いる方法-[setTitle:]-[setRightBarButtonItems:]をスウィズル。 swizzledメソッドは、それぞれカスタムNSNotifications UINavigationItemTitleDidChangeUINavigationItemRightBarButtonItemsDidChangeを単に投稿します。
  • -[prepareForSegue:sender:]私は埋め込みSegueの宛先ビューコントローラを抽出し、ビューコントローラのカスタムプロパティchildViewControllerに保存します。
  • 私のビューコントローラのセッターでchildViewController私は私のカスタムUINavigationItem通知にオブジェクトとして私の子ビューコントローラのナビゲーション項目を使用してオブザーバーを追加します。
  • これらの通知がそれぞれ受信されると、私はビューコントローラのナビゲーション項目のtitleとrightBarButtonItemsをそれぞれ更新します。

自分で修正したところの「別の場所」は、私の子供用ビューコントローラが、それが表示されていると思ったときにその右のバーボタンアイテムを更新していないということでした。右のバーボタン項目。

関連する問題