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

时间:2016-07-13 22:41:38

标签: xamarin xamarin.ios modal-dialog mvvmcross

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

在iOS上使用Xamarin Studio和MvvmCross NuGet版本4.2.2,MvxModalSupportTouchViewPresenterMvxModalNavSupportTouchViewPresenterIMvxModalTouchView都不可用。

ViewModel甚至需要知道特定视图在iOS上呈现为模态视图的事实吗?

2 个答案:

答案 0 :(得分:11)

MvvmCross是一个强大的页面导航框架。使用ShowViewModel<AViewModel>的默认导航将使用堆栈比喻:一个在Android上的另一个,在iOS上相互滑动,并在任一平台上使用&lt; 回去。

您可以通过采用ViewPresenter以接口标记的形式给出提示,告诉IMvxModalIosView给定视图是模态的。

在视图级别

采用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中,触摸已重命名为 iOS ,因此IMvxModalTouchView现在为{{1} }。新的IMvxModalIosView是:

  • using
  • using MvvmCross.iOS.Platform;

答案 1 :(得分:2)

使用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