我将旧项目升级到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 回答
试着这样做:
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中定义的扩展方法我在示例代码中注意到的另一件事是这一行:
传递到
MvxViewController<T>
的类型参数应该与MyView
关联ViewModel
,而不是MyView
本身 . 例如,您可能会遇到以下情况:然后:
-- UPDATE --
您应该继承MvvmCross提供的现有MvxViewController . https://github.com/MvvmCross/MvvmCross/blob/3c735adc534a5df2d4730e9d58a08f7863c30cee/MvvmCross/iOS/iOS/Views/MvxViewController.cs
When creating MVVMCross ViewModels and Views,there are some requirements
实现IMvxIosView解决了这个特殊错误 .
看起来MvvmCross找不到视图,除非它实现了这个接口 .
现在我正在处理其他错误 .