如何在MvvmCross中指定一个视图作为模态视图?

4

我在一个使用MvvmCross框架的MonoTouch应用程序中有一个视图,我希望它以模态展示(NavigationController.PresentModalViewController)。

1个回答

7
MvvmCross的前提是所有ViewModel都只是“普通页面”-因此在iOS/MonoTouch中,这意味着使用UINavigationController呈现的UIViewControllers。
要摆脱这个前提条件-向选项卡显示、模态显示、拆分控制器、弹出窗口等方向移动-则可以调整MonoTouch应用程序中的Presenter逻辑。
Presenter的工作是实现:
public interface IMvxTouchViewPresenter
{
    void Show(MvxShowViewModelRequest view);
    void Close(IMvxViewModel viewModel);
    void CloseModalViewController();
    void ClearBackStack();
    bool PresentModalViewController(UIViewController controller, bool animated);
    void NativeModalViewControllerDisappearedOnItsOwn();
}

你的应用程序中使用的演示者是在AppDelegate构造函数中选择的 - 例如,查看TwitterSearch如何为iPhone和iPad构建不同的演示者。
幸运的是,对于简单的Modal支持,可用的标准演示者之一是MvxModalSupportTouchViewPresenter.cs 该演示者会查看要呈现的视图是否具有IMvxModalTouchView marker接口 - 它测试 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;
    } 

然后将标记接口添加到您的模态视图中:
 public class MyView : MvxBindingTouchViewController<MyViewModel>, IMvxModalTouchView
 {
      // ....
 }

1
干得好,Stuart。顺便说一句,这是一个很棒的框架。这个框架正在支持一个大型项目。 - Kevin
很酷 - 如果你有一些小的聊天问题,可以来 http://jabbr.net/#/rooms/mvvmcross 找我们 - 否则,在 Stack Overflow 上提问是完美的。 - Stuart
此外,对于任何合理规模的iPhone/iPad应用程序,我预计您最终会编写自己的Presenter - 特别是对于iPad。 - Stuart

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