首页 文章

MvvmCross - 查看未加载

提问于
浏览
1

我将旧项目升级到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开发方面经验丰富),但我在查找最新文档时遇到了麻烦 .

3 回答

  • 0

    试着这样做:

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

    vc.OnViewCreate(); 应确保加载 View .

    和行: this.CreateViewControllerFor(MvxViewModelRequest.GetDefaultRequest(viewModelType);) as MvxViewController;

    应确保使用已设置的ViewModel创建ViewController . 这样您就不必手动设置它 .

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

    • 编辑 -

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

    MyView : MvxViewController<MyView> {}
    

    传递到 MvxViewController<T> 的类型参数应该与 MyView 关联 ViewModel ,而不是 MyView 本身 . 例如,您可能会遇到以下情况:

    MyViewModel : ViewModelBase {}
    

    然后:

    MyView : MvxViewController<MyViewModel> {}
    

    -- UPDATE --

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

  • 0

    When creating MVVMCross ViewModels and Views,there are some requirements

    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();
    
  • 1

    实现IMvxIosView解决了这个特殊错误 .

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

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

相关问题