0

エラー処理を追加しようとしています (ビュー モデルの初期化時や他の場所でのネットワーク接続の喪失に対処するためChangePresentation) PresentationHint。これを行うための私のプレゼンター(から派生MvxTouchViewPresenter):

this.MasterNavigationController.PopToRootViewController(false);

これは時折機能しますが、多くの場合機能しません。現在表示されていたビューでスタックしてしまい、メッセージが表示されますUnbalanced calls to begin/end appearance transitions for <MyView: 0x...>。これは、ロードしていたビューのロードが完了する前にメッセージがスローされることがあるからだと思います (データの実際のロードは非同期であり、別のスレッドで起動されるため、問題が発生します)。

私の質問は、これを同期して、すぐにルートにポップするのではなく、実行していることを終了してからルートにポップする方法はありますか? または、これを処理するためのより良い方法はありますか?

4

1 に答える 1

0

あなたの質問には、何が起こっているのかを理解するのに十分なコードがありません。そのエラー メッセージを含む StackOverflow に関する質問は他にもたくさんあります。問題の適切な解決策があるかどうかを確認するために、それらに目を通す価値があるかもしれません。例: UINavigationController popToRootViewController を作成し、すぐに新しいビューをプッシュします。


「ロードの完了」を検出したい場合は、表示されている ViewControllers で ViewDidAppear メッセージをリッスンします。mvx では、すべての ViewController がViewDidAppearCalledカスタム プレゼンターに簡単に接続できるイベントをサポートしているため、これは簡単に実行できます。

    private readonly Queue<Action> _pendingActions = new Queue<Action>();
    private bool _isBusy;

    public override void Show(Cirrious.MvvmCross.Touch.Views.IMvxTouchView view)
    {
        if (_isBusy)
        {
            _pendingActions.Enqueue(() => Show(view));
            return;
        }

        _isBusy = true;
        var eventSource = view as IMvxEventSourceViewController;
        eventSource.ViewDidAppearCalled += OnViewAppeared;

        base.Show(view);
    }

    private void OnViewAppeared(object sender, MvxValueEventArgs<bool> mvxValueEventArgs)
    {
        _isBusy = false;
        var eventSource = sender as IMvxEventSourceViewController;
        eventSource.ViewDidAppearCalled -= OnViewAppeared;
        if (!_pendingActions.Any())
            return;

        var action = _pendingActions.Dequeue();
        action();
    }

    public override void ChangePresentation(Cirrious.MvvmCross.ViewModels.MvxPresentationHint hint)
    {
        if (_isBusy)
        {
            _pendingActions.Enqueue(() => ChangePresentation(hint));
            return;
        }

        base.ChangePresentation(hint);
    }

注: このコードが機能するには 3.0.13 以降が必要です (ViewDidAppear以前のバージョンの一部のビュー コントローラーにはバグがありました)。

単純な UINavigationController を使用している場合、同様の効果を達成する別の方法は、そのコントローラーでデリゲートを使用することです - https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationControllerDelegate_Protocol/Reference/Referenceを参照してください.html

于 2013-10-10T06:51:57.693 に答える