如何在MvvmCross中指定要作为模态推送的视图?

Kev*_*vin 4 xamarin.ios mvvmcross

我在使用MvvmCross框架的MonoTouch应用程序中有一个视图,我想要显示Modal(NavigationController.PresentModalViewController).

Stu*_*art 7

MvvmCross的前提是,所有的ViewModels都只是"正常的网页"开始 - 所以在IOS/MonoTouch的,这意味着使用一个UINavigationController UIViewControllers呈现.

要摆脱这个前提 - 朝向选项卡式显示,模态显示,分割控制器,弹出窗口等 - 然后您可以调整MonoTouch应用程序中的Presenter逻辑.

主持人的工作是实施:

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

用于您的应用程序的演示者在AppDelegate构造中被选中 - 例如,看看TwitterSearch如何为iPhone和iPad构建不同的演示者.


幸运的是,对于简单的Modal支持,可用的标准演示者之一是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;
    } 
Run Code Online (Sandbox Code Playgroud)

然后将标记界面添加到模态视图中:

 public class MyView : MvxBindingTouchViewController<MyViewModel>, IMvxModalTouchView
 {
      // ....
 }
Run Code Online (Sandbox Code Playgroud)