4

MvvmCrossフレームワークを使用するMonoTouchアプリに、モーダル(NavigationController.PresentModalViewController)を表示したいビューがあります。

4

1 に答える 1

7

MvvmCrossは、すべてのViewModelが単なる「通常のページ」であるという前提から始まります。つまり、iOS / MonoTouchでは、UIViewControllerはUINavigationControllerを使用して表示されます。

この前提から離れて(タブ付きディスプレイ、モーダルディスプレイ、分割コントローラー、ポップアップなどに)移動するには、MonoTouchアプリ内でプレゼンターロジックを調整できます。

プレゼンターの仕事は、以下を実装することです。

public interface IMvxTouchViewPresenter
{
    void Show(MvxShowViewModelRequest view);
    void Close(IMvxViewModel viewModel);
    void CloseModalViewController();
    void ClearBackStack();
    bool PresentModalViewController(UIViewController controller, bool animated);
    void NativeModalViewControllerDisappearedOnItsOwn();
}

アプリに使用されるプレゼンターは、AppDelegateの構築で選択されます。たとえば、TwitterSearchがiPhoneとiPad用に異なるプレゼンターを構築する方法をご覧ください。


幸い、単純なモーダルサポートの場合、利用可能な標準プレゼンターの1つはMvxModalSupportTouchViewPresenter.csです。

このプレゼンターは、表示されているビューにIMvxModalTouchViewマーカーインターフェイスがあるかどうかを確認します-テストしますview is IMvxModalTouchView。このインターフェースが存在する場合、「通常のナビゲーション」ではなく、ビューにモーダル表示を使用します。

これを使用するには、AppDelegateコードを次のように変更します。

    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        window = new UIWindow(UIScreen.MainScreen.Bounds);

        // initialize app for single screen iPhone display
        var presenter = new MvxModalSupportTouchViewPresenter(this, window);
        var setup = new Setup(this, presenter);
        setup.Initialize();

        // start the app
        var start = this.GetService<IMvxStartNavigation>();
        start.Start();

        window.MakeKeyAndVisible();

        return true;
    } 

次に、モーダルビューにマーカーインターフェイスを追加します。

 public class MyView : MvxBindingTouchViewController<MyViewModel>, IMvxModalTouchView
 {
      // ....
 }
于 2012-05-09T09:10:43.500 に答える