これは非常に一般的なシナリオです...これを可能にするために、MvvmCross内に2つのメカニズムを含めました....
ClearTop
すべての ViewModel ナビゲーションで使用できるパラメーター。
- すべての ViewModel での
RequestRemoveBackStep()
呼び出し - これは現在 iOS では実装されていませんが、申し訳ありません。
- これで十分でない場合、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 コードだけです。