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实现有关。
有一件事是MvvmCross 3.1.1不是为iOS统一代码构建的。这将阻止您提交应用程序。MvvmCross 4.0目前处于测试阶段,但我建议使用它,因为它有许多修复。
如果代码在第44行试图解析IMvxViewModelLoader
时崩溃,这可能意味着您丢失了IMvxViewModelLoader
所在的某个包。