0

我想定义一个自定义演示者来自定义我的 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 相关的问题。

我猜我要么依赖较旧的文档,要么正在做一些非常非常愚蠢的事情(我猜是后者)。

4

1 回答 1

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()则不使用 - 它不是必需的,因为您在构建期间提供了演示者。

于 2013-10-24T11:45:43.590 回答