MVVMCross:在MvvmCrossTouch设置中永远不会调用CreatePresenter()

时间:2013-10-24 11:11:02

标签: xamarin.ios mvvmcross

我想定义一个自定义演示器来自定义我的UI,在iPad上实现拆分视图等等。我定义了这个类:

class ProjectPresenter : MvxTouchViewPresenter
{
    public ProjectPresenter(UIApplicationDelegate applicationDelegate, UIWindow window) : base(applicationDelegate, window)
    {
    }

    public override void Show(MvxViewModelRequest request)
    {
        IMvxTouchView viewController = this.CreateViewControllerFor(request);
        this.Show(viewController);
    }
}

我在我的MvxTouchSetup类中注册了它,如下所示:

protected override IMvxTouchViewPresenter CreatePresenter()
{
    MvxTrace.Trace("Creating the presenter!");
    return new ProjectPresenter(this.ApplicationDelegate, this.Window);
}

但是,Show()方法中的断点永远不会被命中。我尝试将断点添加到Show(),ChangePresentation()等的所有重载中,但它们永远不会被命中。现在,我知道Xamarin.iOS在断点方面相当不可靠,但即使采用跟踪方法也不会产生任何乐趣。我甚至用一个抛出异常的方法替换了CreatePresenter()方法,并且应用程序没有崩溃。

当我部署它们时,我的应用程序的其他修改会显示出来,所以这不是某种缓存问题,尽管我已经清理了我的PC和Mac上的源代码。此外,我的安装程序类的构造函数中的断点被击中,所以这甚至可能根本不是与Xamarin相关的问题。

我猜我要么依赖旧文档,要么我做的事非常愚蠢(我猜的是后者)。

1 个答案:

答案 0 :(得分:2)

我认为CreatePresenter不会被调用的唯一原因是,如果您使用较早的“基于演示者的”构造函数来构建Setup


MvxTouchSetup提供了两种不同的构造函数:

    protected MvxTouchSetup(MvxApplicationDelegate applicationDelegate, UIWindow window)
    {
        _window = window;
        _applicationDelegate = applicationDelegate;
    }

    protected MvxTouchSetup(MvxApplicationDelegate applicationDelegate, IMvxTouchViewPresenter presenter)
    {
        _presenter = presenter;
        _applicationDelegate = applicationDelegate;
    }

来自https://github.com/MvvmCross/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Touch/Platform/MvxTouchSetup.cs#L39

默认情况下,在基于Nuget的项目和大多数MvvmCross示例中,使用了第一个。

然而,第二种形式实际上是存在的,所以它仍然存在历史原因 - 防止旧的应用程序破坏。如果您使用它,则不使用CreatePresenter() - 因为您在施工期间提供了演示者,所以不需要它。