如何在 MvvmCross 中呈现 iOS 模态视图
How to present an iOS Modal View in MvvmCross
如何使用 MvvmCross 在 iOS 上呈现模态视图?
在 iOS 上使用 Xamarin Studio 和 MvvmCross NuGet 版本 4.2.2,MvxModalSupportTouchViewPresenter
、MvxModalNavSupportTouchViewPresenter
或 IMvxModalTouchView
的 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
如何使用 MvvmCross 在 iOS 上呈现模态视图?
在 iOS 上使用 Xamarin Studio 和 MvvmCross NuGet 版本 4.2.2,MvxModalSupportTouchViewPresenter
、MvxModalNavSupportTouchViewPresenter
或 IMvxModalTouchView
的 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