ナビゲーションバーのUISegmentedControlを使用してアプリケーションのUIViewControllerを切り替えます。ただし、UIViewControlsを複数回切り替えると、ナビゲーションバーからUISegmentedControlが消えます。これは、セグメント化されたコントロールが押されるたびにビューコントロールが初期化されずに新たに割り当てられた場合にのみ発生します。つまり、私は私のアプリでビューを切り替えるたびに新しいUIViewControllerを割り当てる場合、期待された動作が観察されます(例えば、UISegmentedControlは消えません)。しかし、ユーザーがビューを切り替えたときに隠しビューの状態を保存したいので、これは実際的な解決策ではありません。UIViewControllerが常に再インスタンス化されないと、UINavigationBarのUISegmentedControlが消えます
私はhereこれが観察される簡単なプロジェクトのレポを持っています。このプロジェクトは2つのコミットで構成されています。この問題が発生した古いものと、一定の再インスタンス化によって問題が解決された新しいものです。以前約
さらなる詳細は、このリポジトリにコミット:アプリケーションのための2つのビューコントローラ(RootViewControllerとCalendarViewController)は、両方のアプリケーションの寿命のためにインスタンス化されるaccountingAppDelegateで
didFinishLaunchingWithOptions
です。
UISegmentedControlは、didFinishLaunchingWithOptions
メソッドのSegmentedControl.xibという名前のNIBファイルからロードされます。
accountingAppDelegateのtoolBarItems
メソッドは、各ビューコントローラのtoolbarItems
プロパティが設定されているビューコントローラのviewDidAppear
メソッドの両方の簡易メソッドです。 UINavigationControllerは、このプロパティを参照して、the Apple docsを理解した上で、現在のビューのナビゲーションツールバーの項目を割り当てます(「ツールバーの表示」を参照)。
新しいコミットの唯一の違いは、ユーザーが1つずつ切り替えるたびにRootViewControllerとCalendarViewControllerの新しいインスタンスが作成されることです。
私の質問は、なぜ、定数の再インスタンス化が問題を解決するのですか?さらに重要なのは、UISegmentedControlが消えないようにすることができますとは私のアプリケーションのビューステートを保持していますか?
私はあなたのコードを正しく理解していれば、あなたが何をしているのですか? 1.あなたのappDelegateでUINavigationControllerのインスタンスを作成します。 2. RootViewControllerのインスタンスを作成します。これは、UIViewControllerのカスタムクラスです。 3. CalendarViewControllerのインスタンス、つまりUIViewControllerのカスタムクラスを作成します。 4. UINavigationControllerのrootViewControllerとしてスワップします(箇条書き1)。 それは正しいですか? – Canopus
はい。これは正しいです。具体的には、UINavigationControllerの 'setViewControllers:'メソッドを使用して、UINavigationControllerのrootViewControllerプロパティを間接的に変更します。これが起こる場所を知るには、accountingappdelegateのindexDidChangeForSegmentedControlメソッドを参照してください。 – Coder