【问题标题】:MvvmCross - View not loadedMvvmCross - 视图未加载
【发布时间】:2016-04-12 20:50:53
【问题描述】:

我将一个旧项目升级到 Xamarin.iOS Unified 和 MvvmCross 4.1。

当我运行应用程序时,出现以下异常:

MvvmCross.Platform.Exceptions.MvxException:未为 MyView 加载视图

我的课程如下所示:

MyView : MvxViewController<MyViewModel> {}

MvxViewController<T> : UIViewController, IMvxBindingContextOwner, IUIWrappable 
    where T : ViewModelBase

ViewModelBase : MvxViewModel {}

我怀疑我在 MyView 上缺少一个接口或其他东西以使 MvvmCross 正常运行,但我不确定这可能是什么接口。

我怀疑这是因为我已经不得不在 View 和它的 ViewModel 之间的映射中进行硬编码,以使 MvvmCross 能够通过与 MyView 关联的反射/自动发现来找到 ViewModel。也就是说,在此错误之前,我遇到了无法找到关联的 ViewModel 错误。

如果我让 MyView 实现 IMvxIosView,这个错误就会消失,然后我稍后会在我的代码中获得一个对 ViewModel 的空引用,所以在它需要的地方没有被实例化。我的印象是这一切都应该由 MvvmCross 自动处理,但我可能错了。

我正在查看https://github.com/MvvmCross/MvvmCross/wiki/Tip-Calc-A-Xamarin.iOS-UI-project等示例

TipView 包含的地方

public new TipViewModel ViewModel {
    get { return (TipViewModel) base.ViewModel; }
    set { base.ViewModel = value; }
}

MyView 的基础没有这样的 ViewModel 属性。我缺少什么可以访问这个?

TipCalc 的示例代码仍在引用 Cirrious 命名空间,因此可能发生了变化。

感谢任何建议。我是 Xamarin 和 MvvmCross 的新手(虽然在 Windows/iOS 开发方面经验丰富),但我无法找到最新的文档。

【问题讨论】:

  • 从您的问题来看,您的要求并不完全清楚。您有更完整的可重现样品吗?

标签: ios xamarin mvvmcross


【解决方案1】:

在创建 MVVMCross ViewModels 和 Views 时,有一些要求

 1.ViewModel and View needs to have same name until "View" 
eg: MyView , MyViewModel

 2.You need to load stroryboard name to the Viewcontroller.
 eg:namespace [MvxFromStoryboard("MyView")] 
   public partial class MyView:MvxViewController  where TViewModel :MyViewModel

 3. When loading View, you need to have default constructor. 

   public MyView(IntPtr handle) : base(handle){}

 4.You need to bind viewmodel to the view.Most of the time in ViewDidLoad 
method in ViewClass 

 var set = this.CreateBindingSet<MyView, MyViewModel >();   
 set.Apply();

【讨论】:

    【解决方案2】:

    尝试这样做:

        var vc = this.CreateViewControllerFor(MvxViewModelRequest.GetDefaultRequest(viewModelType);) as MvxViewController;
        vc.OnViewCreate();
    

    vc.OnViewCreate(); 应确保您的 View 已加载。

    还有一行: this.CreateViewControllerFor(MvxViewModelRequest.GetDefaultRequest(viewModelType);) as MvxViewController;

    应确保创建 ViewController 时已设置 ViewModel。这样你就不必手动设置了。

    该方法是MvxCanCreateIosViewExtensionMethodshttps://github.com/MvvmCross/MvvmCross/blob/4.0/MvvmCross/iOS/iOS/Views/MvxCanCreateIosViewExtensionMethods.cs中定义的扩展方法

    -- 编辑--

    我在您的示例代码中注意到的另一件事是这一行:

    MyView : MvxViewController<MyView> {}
    

    传入MvxViewController&lt;T&gt; 的类型参数应该是MyView 的关联ViewModel,而不是MyView 本身。因此,例如,您可能有以下内容:

    MyViewModel : ViewModelBase {}
    

    然后:

    MyView : MvxViewController<MyViewModel> {}
    

    -- 更新--

    您应该继承自 MvvmCross 提供的现有 MvxViewController。 https://github.com/MvvmCross/MvvmCross/blob/3c735adc534a5df2d4730e9d58a08f7863c30cee/MvvmCross/iOS/iOS/Views/MvxViewController.cs

    【讨论】:

    • 感谢您的建议。我可以毫无问题地实例化视图,但是 CreateViewController 在 MvvmCross 中抛出了一个空引用,并且由于库已打包,我现在看不到哪里。我得下载源码才能看到。也就是说,我认为我做错了什么。根据我看到的示例,所有这些都应该可以正常工作。
    • 啊,好吧。我注意到您提供的代码中有其他内容,请参阅我的答案的更新。
    • 感谢您注意到这一点,实际上我确实使用 ViewModel 模板化了 MvxViewController。我一定是把它复制错了。我的错。更正了原来的问题。
    【解决方案3】:

    实施 IMvxIosView 解决了这个特定错误。

    看起来 MvvmCross 找不到视图,除非它实现了这个接口。

    现在我正在处理其他错误。

    【讨论】:

    • 您不需要在 ViewController 上实现 IMvxIosView。你所有的 ViewController 都应该继承自 MvvmCross 提供的 MvxViewController 类:github.com/MvvmCross/MvvmCross/blob/…
    • @pnavk,使用 MvvmCross.iOS.Views 命名空间中的内置 MvxViewController 类创造了奇迹。我不确定为什么最初的开发人员制作了这个其他类,但似乎不再需要它了。如果你回复我会接受。
    • 我将其添加为对我的答案的更新。很高兴你的工作正常:)
    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2012-08-23
    • 2020-12-06
    • 2019-02-19
    • 2017-01-14
    • 2015-12-25
    相关资源
    最近更新 更多