0

iOSアプリケーションの画面間を移動しています。

BaseView.NavigationController.ViewControllers

画面を切り替えるとき、前の画面への参照を静的変数に保持します。

ある時点で、アイテムの1つがBaseView.NavigationController.ViewControllersから削除されますが、それはまだ有効なビューコントローラーであり、IsLoadedはTrue/YESに設定されています。

使用する場合(C#/ MonoTouchをご容赦ください)

BaseView.NavigationController.PopToViewController(CurrentViewController,false); 

もう一度表示すると、NSInternalInconsistencyExceptionが発生します。理由:存在しないビューコントローラにポップしようとしました。ViewControllerコレクションには含まれていないため、これは理解できます。

画面を切り替える方法は、さまざまな画面への参照を保持し、画面を表示するための一般的なメソッドを呼び出すことです。その方法では、このロジックを使用して、プッシュするかポップするかを決定します。

        if (CurrentViewController.IsViewLoaded)
        {

            BaseView.NavigationController.PopToViewController(CurrentViewController,false);
        }
        else
        {
            BaseView.NavigationController.PushViewController(CurrentViewController,true);
        }

私の質問は、それがどこに行き、なぜそれがViewControllersコレクションから削除されたのか、そしてそれがStillLoaded = true / YESのときですか?

4

1 に答える 1

0

私が正しく理解している場合、あなたはNavigationController.PopToViewController(controller);特定のView Controllerに戻るために使用していますが、ナビゲーションスタックからポップされたViewControllerの参照を保持しています。

私が考えているのは、これらのView Controllerへの参照を保持しているためです。これらはまだメモリ内にあり、したがって、 ViewControllerが実際にはナビゲーションスタックに存在しないにもかかわらず、IsViewLoadedプロパティは引き続き存在します。true

プロパティを使用するのではなくIsViewLoaded、View ControllerがNavigationController.ViewControllers配列に存在するかどうかを確認する必要があります。存在する場合はポップし、存在しない場合はプッシュします。

例えば

if (BaseView.NavigationController.ViewControllers.Contains(CurrentViewController))
{
    BaseView.NavigationController.PopToViewController(CurrentViewController,false);
}
else
{
    BaseView.NavigationController.PushViewController(CurrentViewController,true);
}

編集

つまり、ビューをナビゲーションスタックに保持したいということです。そうですね、PopToViewControllerを使用すると、TopViewControllerと指定されたコントローラーの間のすべてのビューコントローラーが削除されます。

NavigationControllers.ViewControllers目的を達成するために、配列を直接操作できます。これに関する唯一の問題は、Push/Popメソッドが提供する優れたアニメーションが失われることです。

// Changes order of View Controllers currently in the stack. You can also add/remove 
// controllers using this method.
NavigationController.ViewControllers = new UIViewController[]{
          NavigationController.ViewControllers[1],
          NavigationController.ViewControllers[0],
          NavigationController.ViewControllers[3],
          NavigationController.ViewControllers[2]};
于 2012-11-25T02:55:28.137 に答える