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

3

如何使用MvvmCross在iOS上展示模态视图?

在iOS的Xamarin Studio和MvvmCross NuGet版本4.2.2中,MvxModalSupportTouchViewPresenterMvxModalNavSupportTouchViewPresenter或者IMvxModalTouchView都不可用。

ViewModel需要知道一个特定的视图在iOS上是以模态视图的形式展示吗?

2个回答

11

MvvmCross是一个强大的页面导航框架。使用ShowViewModel<AViewModel>进行默认导航时,会使用“堆栈”隐喻:在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;

有人能提供一个例子吗?我正在尝试使用UIView来实现,但它没有显示为模态视图。 - Ph0b0x

2
使用MvvmCross 5.5.2,我只需在iOS视图中添加以下MvxModalPresentation属性即可获得一个模态框:
[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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接