MvvmCross - 查看未加载

时间:2016-04-12 20:50:54

标签: ios xamarin mvvmcross

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

2 个答案:

答案 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。这样你就不必手动设置它。

该方法是MvxCanCreateIosViewExtensionMethodshttps://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