MvvmCross - 如何从其他程序集加载iOS视图?

时间:2016-02-10 18:53:00

标签: cross-platform mvvmcross xamarin-forms

我试图让我的xamarin-forms + mvvmcross项目中的视图正确加载而没有运气。

项目结构细分:

  

项目:Shared.Core - 100%跨平台代码,视图模型,模型,   等。

     

项目:Shared.Mobile - Xamarin表单视图

     

项目:iOS - 使用共享视图

     

项目:Android - 使用共享视图

     

项目:UWP - 使用共享视图

     

项目:WPF - 使用WPF本机视图

我有一个使用mvvmcross的工作WPF项目,我正试图让移动设备从iOS开始。

iOS项目仅在视图和视图模型位于同一个程序集中时才加载视图。否则我得到了:

  

Foundation.MonoTouchException:抛出Objective-C异常。名称:   NSInternalInconsistencyException原因:应用程序窗口是   期望在应用程序结束时有一个根视图控制器   发射

通过获取PCL Views文件夹并将其移动到iOS项目,可以从此示例项目中看到相同的内容。

https://github.com/MvvmCross/MvvmCross-Forms/tree/master/Samples/Example001XAML

我也试过以下无济于事:

Setup.cs

protected override IEnumerable<Assembly> GetViewModelAssemblies()
{
    var result = base.GetViewModelAssemblies();
    var assemblyList = result.ToList();
    assemblyList.Add(typeof(FirstViewModel).Assembly);
    return assemblyList.ToArray();
}

protected override IEnumerable<Assembly> GetViewAssemblies()
{
    var result = base.GetViewAssemblies();
    var assemblyList = result.ToList();
    assemblyList.Add(typeof(FirstPage).Assembly);
    return assemblyList.ToArray();
}

protected override void InitializeViewLookup()
{
    base.InitializeViewLookup();

    var vmLookup = new Dictionary<Type, Type> {
        {typeof (FirstViewModel), typeof (FirstPage)},
        {typeof (AboutViewModel), typeof (AboutPage)}
    };

    var container = Mvx.Resolve<IMvxViewsContainer>();
    container.AddAll(vmLookup);
}

1 个答案:

答案 0 :(得分:1)

我刚刚在Forms presenter核心中解决了这个问题,现在它可以运行了!您已在正确的轨道上覆盖GetViewsAssembliesInitializeViewLookup。如果演示者已经正确实施,那么它应该如何工作。

无论如何,随着Pull Request的新变化,它的工作方式是:

覆盖GetViewsAssembliesInitializeViewLookup在内部将视图映射到ViewModel,从找到的视图告诉MvvmCross查找它们。 Setup.cs中的代码如下所示:

protected override IEnumerable<Assembly> GetViewAssemblies()
{
    var result = base.GetViewAssemblies();
    var assemblyList = result.ToList();
    assemblyList.Add(typeof(FirstPage).Assembly);
    return assemblyList;
}

其中FirstPage是包含视图的程序集中的一个页面。

或者您可以在InitializeViewLookup中明确告诉MvvmCross如何将视图映射到ViewModel:

protected override void InitializeViewLookup()
{
    base.InitializeViewLookup();

    var vmLookup = new Dictionary<Type, Type> {
        {typeof (FirstViewModel), typeof (FirstPage)}
    };

    var container = Mvx.Resolve<IMvxViewsContainer>();
    container.AddAll(vmLookup);
}