3

私たちのアプリにはログインがありますViewController A。ユーザーのログイン時に、リクエスト ナビゲートが自動的に呼び出され、次の に移動しViewController Bます。ただし、これが完了しViewController Aたら、スタックからログインを削除して、ユーザーがログインビューに「戻る」ことができずViewController、代わりにログイン前の前に戻るようにします。

がロードされViewController Aたときにスタックから削除することを考えましたが、より良い方法はありますか?ViewController B

設定したアプリの Android バージョンではhistory=no(正しく思い出せば)、動作します。

MonoTouch と MvvmCross でこれを達成する同様の方法はありますか?

4

3 に答える 3

8

不要なビューコントローラーをナビゲーションコントローラーから削除することになりました。ViewDidDisappear()ログインで、次ViewControllerのことを行いました。

public override void ViewDidDisappear (bool animated)
{
    if (this.NavigationController != null) {
        var controllers = this.NavigationController.ViewControllers;
        var newcontrollers = new UIViewController[controllers.Length - 1];
        int index = 0;
        foreach (var item in controllers) {
            if (item != this) {
                newcontrollers [index] = item;
                index++;
            }

        }
        this.NavigationController.ViewControllers = newcontrollers;
    }
    base.ViewDidDisappear(animated);
}

このようにViewControllerして、ビューから削除されたときに不要なものを削除します。それが正しい方法であるかどうかは完全には確信が持てませんが、かなりうまく機能しています。

于 2012-12-19T12:21:28.703 に答える
1

これは非常に一般的なシナリオです...これを可能にするために、MvvmCross内に2つのメカニズムを含めました....

  1. ClearTopすべての ViewModel ナビゲーションで使用できるパラメーター。
  2. すべての ViewModel でのRequestRemoveBackStep()呼び出し - これは現在 iOS では実装されていませんが、申し訳ありません。
  3. これで十分でない場合、3 つ目の方法として、カスタム プレゼンターを使用して表示ロジックを支援することもできます。

使用するには: 1.ClearTopすべての ViewModel ナビゲーションで使用できるパラメーター。

これを使用するには、ナビゲートするときに ClearTop フラグを含めるだけです。

これはブール値のフラグです。使用するには、次のように変更するだけです。

this.RequestNavigate<ChildViewModel>(new {arg1 = val1});

this.RequestNavigate<ChildViewModel>(new {arg1 = val1}, true);

ClearBackStack標準の単純なナビゲーション コントローラー プレゼンターの場合、これは新しいビューが表示される前に呼び出されます。

    public override void ClearBackStack()
    {
        if (_masterNavigationController == null)
            return;

        _masterNavigationController.PopToRootViewController (true);
        _masterNavigationController = null;
    }

https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Touch/Views/Presenters/MvxTouchViewPresenter.csから

標準のナビゲーション コントローラーを使用していない場合 (たとえば、タブ付き、モーダル、ポップアップ、または分割ビュー表示を使用している場合)、これを処理するために独自のプレゼンテーション ロジックを実装する必要があります。


できないこと: 2. RequestRemoveBackStep().

悲しいことに、これを iOS の一般的なレベルで実装するのは少し厄介であることが判明しました。現在、その方法は次のとおりです。

    public bool RequestRemoveBackStep()
    {
#warning What to do with ios back stack?
        // not supported on iOS really
        return false;
    }

https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Touch/Views/MvxTouchViewDispatcher.csから

ごめん!私はこれに対してバグを提起しました - https://github.com/slodge/MvvmCross/issues/80


3. いつでも... カスタム アイデア

iOS アプリに何かカスタムを実装する必要がある場合、最善の方法は、ある種のカスタム プレゼンター ロジックを使用してこれを行うことです。

これを行う方法はたくさんあります。

一例は次のとおりです。

  • 前のビューをクリアする必要があるビューまたはビューモデルの場合、ビューまたはビューモデルを[Special]属性で装飾できます
  • アプリのShowカスタムPresenterで、その属性を監視し、その時点で特別な動作を行うことができます

    public override void Show(MvxShowViewModelRequest request)
    {
        if (request.ViewModelType.GetCustomAttributes(typeof(SpecialAttribute), true).Any())
        {
            // do custom behaviour here - e.g. pop current view controller
        }
    
        base.Show(request);
    }
    

明らかに、他のメカニズムが利用できる可能性があります。この段階では、C# と UIKit コードだけです。

于 2012-12-18T14:43:34.630 に答える
0

mvvm についてはわかりませんが、アニメーションなしでビューコントローラー (AC A) を単純にポップしてから、新しいビューコントローラー (AC B) をアニメーション付きでプッシュすることができます

AC A 内から:

NavigationController.PopViewControllerAnimated(false);
NavigationController.PushViewController(new ACb(), true);
于 2012-12-18T14:29:03.740 に答える