我将旧项目升级到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开发方面经验丰富),但我在查找最新文档方面遇到了困难。
答案 0 :(得分:1)
创建MVVMCross ViewModels和Views时,存在一些要求
vm.searchData = function() {
if (vm.searchText.length <= 0) {
vm.finalData = [];
}
else{
vm.finalData = $filter('filter')(vm.jsonData, { id: vm.searchText});
}
}
答案 1 :(得分: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
类https://github.com/MvvmCross/MvvmCross/blob/4.0/MvvmCross/iOS/iOS/Views/MvxCanCreateIosViewExtensionMethods.cs
- 编辑 -
我在示例代码中注意到的另一件事是这一行:
MyView : MvxViewController<MyView> {}
传递到MvxViewController<T>
的类型参数应该是ViewModel
的关联MyView
,而不是MyView
本身。例如,您可能有类似的内容:
MyViewModel : ViewModelBase {}
然后:
MyView : MvxViewController<MyViewModel> {}
- 更新 -
您应该继承MvvmCross提供的现有MvxViewController。 https://github.com/MvvmCross/MvvmCross/blob/3c735adc534a5df2d4730e9d58a08f7863c30cee/MvvmCross/iOS/iOS/Views/MvxViewController.cs