如何在 MvvmCross 中呈现 iOS 模态视图

How to present an iOS Modal View in MvvmCross

如何使用 MvvmCross 在 iOS 上呈现模态视图?

在 iOS 上使用 Xamarin Studio 和 MvvmCross NuGet 版本 4.2.2,MvxModalSupportTouchViewPresenterMvxModalNavSupportTouchViewPresenterIMvxModalTouchView 的 none 甚至可用.

ViewModel 甚至需要知道特定视图在 iOS 上显示为模态视图这一事实吗?

MvvmCross 是一个强大的页面导航框架。使用 ShowViewModel<AViewModel> 的默认导航将使用 stack 隐喻:在 Android 上一个在另一个之上,在 iOS 上相互滑动,并使用 < 在任一平台上返回。

您可以通过采用 IMvxModalIosView.

以界面标记的形式给它提示来告诉 ViewPresenter 给定视图是模态的

在视图级别

采用IMvxModalIosView协议:

public partial class AView : MvxViewController, IMvxModalIosView

在 AppDelegate 级别

var setup = new Setup(this, Window)替换为:

var presenter = new MvxModalSupportIosViewPresenter(this, Window);
var setup = new Setup(this, presenter);
setup.Initialize();

在 ViewModel 级别

无需更改。 ViewModel 实际上并不知道模态表示。调用:

ShowViewModel<AViewModel> // May be modal on certain platforms

要关闭页面并返回上一个页面,无论您的演示风格如何,都可以在那个 ViewModel 上使用 Close(this)。这将关闭 模式对话框,或弹出 推送视图。一个完整的、可绑定的 ICommand 可能如下所示:

public ICommand BackCommand {
    get { return new MvxCommand(() => Close(this)); }
}

注意事项: 在MvvmCross 4.2.2中,Touch已更名为iOS,所以 IMvxModalTouchView 现在是 IMvxModalIosView。新的 using 是:

  • using MvvmCross.iOS.Platform;
  • using MvvmCross.iOS.Views.Presenters;

使用 MvvmCross 5.5.2 获得模态所需要做的就是将以下 MvxModalPresentation 属性添加到我的 iOS 视图中:

[Register("ExampleModalView")]
    [MvxModalPresentation(
        ModalPresentationStyle = UIModalPresentationStyle.PageSheet,
        ModalTransitionStyle = UIModalTransitionStyle.CoverVertical     
    )]
    public class ExampleModalView : MvxViewController
    {
        public ExampleModalView() {

        }
     ...
}

使用 IMvxNavigationService 服务启动模式很简单

        await _navigationService.Navigate<ExampleModalViewModel>();

ExampleModalViewModel 只需要是继承自 MvxViewModel 的普通 MvvmCross 视图模型。

iOS 游乐场项目中的 ModalView.cs 对此很有用:https://github.com/MvvmCross/MvvmCross/blob/develop/TestProjects/Playground/Playground.iOS/Views/ModalView.cs#L12