繁体   English   中英

Xamarin.IOS MvvmCross应用程序在iOS9的ViewDidLoad方法中引发NullReference异常

[英]Xamarin.IOS MvvmCross App throws NullReference Exception in ViewDidLoad method in iOS9

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

该应用程序看起来像TabControl应用程序,但它是MainViewCotnroller上的按钮,使它具有Tab感。 视图在Storyboard和MainViewController中声明,

PrepareForSegue(UIStoryboardSegue segue,NSObject sender)方法

会被覆盖以根据所选的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 beta的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是nuget中最新的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:
.....

我只是通过在View.cs中调用以下内容来尝试上述操作:

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

我禁用了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和3.5.1 MvvmCross已在线路44 NullReference问题它获取的viewDidLoad中调用MvxViewControllerExtensionMethods ,但与iOS 8.4及以下效果很好

我只是熟悉MvvmCross框架,不确定MvvmCross和iOS 9是否存在问题。

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

注意 :MvvmCross示例可在iOS9上正常运行。 因此,我相信它必须与Tab实现有关。

一件事是MvvmCross 3.1.1并非针对iOS统一代码而构建。 这将阻止您提交应用。 MvvmCross 4.0当前处于beta中,但我建议使用它,因为它有很多修复程序。

如果在尝试解析IMvxViewModelLoader时代码在第44行崩溃,则可能意味着您缺少IMvxViewModelLoader所在的某些软件包。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM