我有一個使用MvvmCross的MonoTouch項目。我處於可以編譯我的核心項目代碼的階段(付出了相當大的努力),現在我正在爲iOS創建視圖。運行Xamarin工具的最新穩定版本,以及MvvmCross。另外,我針對安裝了XCode 5的iOS7 SDK運行。在與MvvmCross綁定期間的NullReference異常
首先,我創建了一個非常基本的視圖,其中的文本字段綁定到我的主視圖模型。在視圖中的相關代碼如下:
[Register("MainView")]
public partial class MainView : MvxViewController
{
public override void ViewDidLoad()
{
View = new UIView { BackgroundColor = UIColor.White };
base.ViewDidLoad();
var uiTextField = new UITextField(new RectangleF(0, 100, 320, 100));
Add(uiTextField);
this.CreateBinding(uiTextField).To<MainViewModel>(vm => vm.IsDebug).Apply();
}
}
的結合但是投用以下堆棧跟蹤一個NullReference異常:
System.NullReferenceException:未設置爲在物體 的實例對象引用Cirrious.MvvmCross.Binding.BindingContext.MvxBaseFluentBindingDescription 1[MonoTouch.UIKit.UITextField].SourcePropertyPath[MainViewModel] (System.Linq.Expressions.Expression
1在SourceProperty)[0x00000]中:在Cirrious.MvvmCross.Binding.BindingContext.MvxFluentBindingDescription 1[MonoTouch.UIKit.UITextField].To[MainViewModel] (System.Linq.Expressions.Expression
1名在SourceProperty)[0x00000]在0 :0 在ProjectX.Views.MainView.ViewDidLoad( )/ Users/jerriepelser/Dev中的[0x000a4] MonoTouch.ObjCRuntime.Messaging:void_objc_msgSend(intptr,intptr) at MonoTouch.UIKit.UIWindow(1)打印/ 1degree軟件/ ProjectX/Source/ProjectX.MonoTouch/Views/MainView.cs:26 at(wrapper managed-to-native) .MakeKeyAndVisible()[0x00010]位於/Developer/MonoTouch/Source/monotouch/src/UIKit/UIWindow.g.cs:129 at ProjectX.AppDelegate.FinishedLaunching(MonoTouch.UIKit.UIApplication app,MonoTouch.Foundation.NSDictionary options) [0x0003c] in/Users/jerriepelser/Development/1degree Software/ProjectX/Source/ProjectX.MonoTouch/AppDelegate.cs:27 at at(wrapper managed-to-native)MonoTouch.UIKit.UIApplication:UIApplicationMain(int,string [ ],intptr,intptr) at MonoTouch.UIKit.UIApplication.Main(System.String [] args,System.String principalClassName,System.String delegateClassName)[0x0004c] in/Developer/MonoTouch/Source/monotouch/src /在ProjectX.Application.Main(System.String [] args)中的UIKit/UIApplication.cs:38 /Users/jerriepelser/Development/1degree Software/ProjectX/Source/ProjectX.MonoTouch/Main.cs中的[0x00008]:16
如果我在綁定之前設置了一個斷點,我可以確認ViewModel在基礎MvxViewController類上正確設置,所以它不是沒有設置ViewModel的問題。
我也想這樣做數據綁定的方式如下:
var set = this.CreateBindingSet<MainView, MainViewModel>();
set.Bind (uiTextField).To (vm => vm.IsDebug);
set.Apply();
仍然獲得了NullReference例外,但具有下列堆棧跟蹤:
System.NullReferenceException:對象未設置爲一個對象 的實例在Cirrious.MvvmCross.Binding.BindingContext.MvxBaseFluentBindingDescription 1[MonoTouch.UIKit.UITextField].SourcePropertyPath[MainViewModel] (System.Linq.Expressions.Expression
1在SourceProperty)[0x00000]在:0 在Cirrious.MvvmCross.Binding.BindingContext.MvxFluentBindingDescription 2[MonoTouch.UIKit.UITextField,OneLove.Core.ViewModels.MainViewModel].To (System.Linq.Expressions.Expression
1在SourceProperty) [0x00000] in:0 at OneLove.Views.MainView.ViewDidLoad()[0x000a6] in/Users/jerriepelser/Development/1degree Software/OneLove/Source/OneLove.MonoTouch/Views/MainView.cs:29 at(包裝託管到本機)MonoTouch.ObjCRuntime.Messaging:void_objc_msgSend(intptr,intptr) at MonoTouch.UIKit.UIWindow.MakeKeyAndVisible()[0x00010] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIWindow.g .cs:129 位於/ Users/jerriepelser/Development/1degree Software/OneLove/Source/OneLove.MonoTouch/AppDelegate中的OneLove.AppDelegate.FinishedLaunching(MonoTouch.UIKit.UIApplication應用程序,MonoTouch.Foundation.NSDictionary選項)[0x0003c]。cs:27 at at(wrapper managed-to-native)MonoTouch.UIKit.UIApplication:UIApplicationMain(int,string [],intptr,intptr) at MonoTouch.UIKit.UIApplication.Main(System.String [] args,System .String principalClassName,System.String delegateClassName)在/Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38 處的OneLove.Application.Main(System.String [] args)[0x00008]中的[0x0004c]/Users/jerriepelser/Development/1degree Software/OneLove/Source/OneLove.MonoTouch/Main.cs:16
看着MvvmCross調試輸出,我不知道什麼是錯的。有任何想法嗎?
不知道。這個錯誤表明,也許你錯過了其中一個解析器 - 但我想不出任何你會錯過正常的'第一個應用'集合中的方式。也許你有某種混合搭配的程序集,或者有一個Xamarin設置問題?像https://github.com/slodge/Enabling這樣的簡單測試項目是否適合您?如果是的話,那麼看看你能否發現這種差異。如果不是,那麼請使用完整跟蹤來更新問題(或鏈接到完整跟蹤的要點) – Stuart
我無法在Xamarin Studio中使用NuGet來運行MvvmCross,因此我下載了最新的二進制文件並引用了它。我不知道它是否是組合混音,因爲我引用的是同一個「Touch」文件夾中的所有文件,除了我從「Portable」文件夾引用的那些文件以外。按照你的建議,會再次經歷它,因爲我用手做了所有事情,並且可能會在我身邊搞砸。 –
開始一個新項目,讓Nuget包按照這個問題的描述工作:http://stackoverflow.com/questions/17653208/getting-pcl-mvvmcross-nuget-and-xamarin-studio-to-play-nice-on -蘋果電腦。它的工作狀況很好,所以我會明天將我的項目退回到骨頭,並嘗試找出問題所在。 –