Xamarin的.IOS MvvmCross App在iOS9的ViewDidLoad方法中抛出NullReferenc

本文关键字:方法 NullReferenc ViewDidLoad iOS9 IOS MvvmCross App Xamarin | 更新日期: 2023-09-27 18:13:46

我正在使用PCL开发现有的Xamarin iOS应用程序,并使用MvvmCross进行IoC和数据绑定。基于MvvmCross 3.1.1构建

这个应用程序看起来像一个TabControl应用程序,但它是mainviewcontroller上的按钮,给它Tab的感觉。视图是在Storyboard和MainViewController,

中声明的

PrepareForSegue(UIStoryboardSegue, NSObject sender) method

被重写,以加载选定的"Tab"视图,该视图基于选定的Segue -如下面的

  if (segue.Identifier == "FirstSegue")
 {
     var dest = segue.DestinationViewController as FirstView;
     dest.Request = new MvxViewModelRequest<FirstViewModel>(null, null, new MvxRequestedBy());
     foreach (UIView v in src.placeHolderView.Subviews)
     {
         v.RemoveFromSuperview();
     }
     dest.View.Frame = new CGRect(0f, 0f, w, h);
     src.placeHolderView.Add(dest.View);
 }

该应用程序在iOS 7.1到8.4的iphone上运行良好。

就在iOS 9发布之前,我在带有iOS 9.1测试版的iPhone 6上测试安装了这款应用,结果应用在加载时崩溃了。我检索了设备日志(如下)并分析了问题是在MvvmCross ViewDidLoad方法的内部。我更新了最新的sdk (XCode 7, Xamarin)。IOS 9.0),并按照Xamarin提供的说明,使用最新的sdk再次编译应用程序,同样的错误。更新了MvvmCross的Nuget包参考到3.5.1,但仍然存在相同的问题

问题是在GitHub中3.5 MvvMCross源代码的第44行有一个空引用

注意:这段代码至少从3.1起就没有改变过,3.5.1是MvvmCross的最新版本

下面的堆栈跟踪(应用程序名称,项目名称因安全原因更改):

   2015-09-21 11:06:26.991 MyApp[1210:60b] Unhandled managed exception:
Object reference not set to an instance of an object (System.NullReferenceException)
  at Cirrious.CrossCore.Mvx.Resolve[IMvxViewModelLoader] () [0x00006] in <filename unknown>:0 
  at Cirrious.MvvmCross.Touch.Views.MvxViewControllerExtensionMethods.LoadViewModel (IMvxTouchView touchView) [0x00057] in <filename unknown>:0 
  at Cirrious.MvvmCross.Views.MvxViewExtensionMethods.OnViewCreate (IMvxView view, System.Func`1 viewModelLoader) [0x00012] in <filename unknown>:0 
  at Cirrious.MvvmCross.Touch.Views.MvxViewControllerExtensionMethods.OnViewCreate (IMvxTouchView touchView) [0x00001] in <filename unknown>:0 
  at Cirrious.MvvmCross.Touch.Views.MvxViewControllerAdapter.HandleViewDidLoadCalled (System.Object sender, System.EventArgs e) [0x00007] in <filename unknown>:0 
  at (wrapper delegate-invoke) <Module>:invoke_void_object_EventArgs (object,System.EventArgs)
  at Cirrious.CrossCore.Core.MvxDelegateExtensionMethods.Raise (System.EventH
andler eventHandler, System.Object sender) [0x00004] in <filename unknown>:0 
  at Cirrious.CrossCore.Touch.Views.MvxEventSourceTableViewController.ViewDidLoad () [0x00006] in <filename unknown>:0 
  at MyProject.Touch.MostPurchasedView.ViewDidLoad () [0x00048] in d:'Working'Repo'MyApp'<MyProjectName>'MyProject.Touch'Views'OneOfTheView.cs:31 
  at (wrapper managed-to-native) ObjCRuntime.Messaging:IntPtr_objc_msgSendSuper (intptr,intptr)
  at UIKit.UIViewController.get_View () [0x00030] in /Users/builder/data/lanes/2077/d230615b/source/maccore/src/build/ios/native/UIKit/UIViewController.g.cs:2632 
  at MyProject.Touch.HomeViewController.PrepareForSegue (UIKit.UIStoryboardSegue segue, Foundation.NSObject sender) [0x0016a] in d:'Working'Repo'MyApp'MyProject.Mobile'MyProject.Touch'HomeViewController.cs:335 
  at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
  at 
UIKit.UIApplication.Main (System.String[] args, IntPtr principal, IntPtr delegate) [0x00005] in /Users/builder/data/lanes/2077/d230615b/source/maccore/src/UIKit/UIApplication.cs:74 
  at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0001c] in /Users/builder/data/lanes/2077/d230615b/source/maccore/src/UIKit/UIApplication.cs:57 
  at MyProject.Touch.Application.Main (System.String[] args) [0x00001] in d:'Working'Repo'MyApp'MyProject.Mobile'MyProject.Touch'Main.cs:16 
2015-09-21 11:06:26.994 MyApp[1210:60b] critical: Stacktrace:
Native stacktrace:
.....

我尝试了上面的方法,只是在视图中调用下面的方法。cs:

    public override void ViewDidLoad()
    {
        try
        {
            base.ViewDidLoad();
        }
        catch (Exception ex)
        {
           // throw a toast msg in the UI            
        }
    }

我禁用了所有base.ViewDidLoad()ViewDidLoad覆盖方法中的View.cs文件中的base.ViewDidLoad()将其带到下一个级别和相同的问题,但在MvxSimpleTableViewSource类的构造函数

设备日志如下:

Object reference not set to an instance of an object (System.NullReferenceException)
      at Cirrious.CrossCore.Mvx.TryResolve[IMvxTouchSystem] (IMvxTouchSystem& service) [0x00006] in <filename unknown>:0 
      at Cirrious.CrossCore.Touch.Platform.MvxIosMajorVersionChecker.ReadIsIosVersionOrHigher (Int32 target, Boolean defaultValue) [0x00000] in <filename unknown>:0 
      at Cirrious.CrossCore.Touch.Platform.MvxIosMajorVersionChecker..ctor (Int32 major, Boolean defaultValue) [0x00006] in <filename unknown>:0 
      at Cirrious.MvvmCross.Binding.Touch.Views.MvxSimpleTableViewSource..ctor (UIKit.UITableView tableView, System.String nibName, System.String cellIdentifier, Foundation.NSBundle bundle) [0x00000] in <filename unknown>:0 
      at MyProject.Touch.MostPurchasedView.ViewDidLoad () [0x00059] in d:'Working'Repo'MyApp'MyProject.Mobile'MyProject.Touch'Views'OneOfTheView.cs:42 
      at (wrapper managed-to-native) ObjCRuntime.Messaging:IntPtr_objc_msgSendSuper (intptr,intptr)
      at UIKit.UIViewController.get_View () [0x00030] in /Users/builder/data/lanes/2077/d230615b/source/maccore/src/build/ios/native/UIKit/UIViewController.g.cs:2632 
      at MyProject.Touch.HomeViewController.PrepareForSegue (UIKit.UIStoryboardSegue segue, Foundation.NSObject sender) [0x0016a] in d:'Working'Repo'MyApp'MyProject.Mobile'MyProject.Touch'HomeViewController.cs:343 
      at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
      at UIKit.UIApplication.Main (System.String[] args, IntPtr principal, IntPtr delegate) [0x00005] in /Users/builder/data/lanes/2077/d230615b/source/maccore/src/UIKit/UIApplication.cs:74 
      at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0001c] in /Users/builder/data/lanes/2077/d230615b/source/maccore/src/UIKit/UIApplication.cs:57 
      at MyProject.Touch.Application.Main (System.String[] args) [0x00001] in d:'Working'Repo'MyApp'MyProject.Mobile'MyProject.Touch'Main.cs:16 

总之:

仅在iOS 9.1中,MvvmCross 3.1.1和MvvmCross 3.5.1在MvxViewControllerExtensionMethods类的第44行有一个NullReference问题,该问题在ViewDidLoad期间被调用,但在iOS 8.4及以下版本中工作良好

我刚刚熟悉MvvmCross框架,不确定这是否是MvvmCross和iOS 9的问题。

有人遇到过这个问题吗?如有任何帮助,我将不胜感激。

注意: MvvmCross示例在iOS9下工作良好。所以我相信它一定是与Tab实现有关。

Xamarin的.IOS MvvmCross App在iOS9的ViewDidLoad方法中抛出NullReferenc

有一件事是MvvmCross 3.1.1不是为iOS统一代码构建的。这将阻止您提交应用程序。MvvmCross 4.0目前处于测试阶段,但我建议使用它,因为它有许多修复。

如果代码在第44行试图解析IMvxViewModelLoader时崩溃,这可能意味着您丢失了IMvxViewModelLoader所在的某个包。