2015-05-15 44 views
4

我開始使用iOS中的MvvmCross。ViewModel在ViewDidLoad期間爲空

public class MainView : MvxTabBarViewController 
{ 
    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 

     var vm = (MainViewModel)this.ViewModel; 
     if (vm == null) 
      return; 
    } 
} 

設置斷點的地方訪問ViewModel線,表明我,那ViewModel爲空。

我可以通過在構造函數中調用ViewDidLoad()來解決這個問題。然後,ViewModel在構造函數調用期間爲空,但在默認的ViewDidLoad調用中有效。但是,這看起來像一個解決方法。任何人都可以幫忙嗎?

回答

4

我猜在這裏,這裏的問題將特定於TabBarViewController的構建方式。

ViewDidLoad是一種虛擬方法,它被稱爲第一次訪問視圖。

TabBarViewController這種情況iOS的基本視圖的構造過程中會發生 - 即它發生之前類本身有它的構造函數調用。

解決此問題的唯一方法是在ViewDidLoad中添加一個檢查,並在類構造函數中第二次調用ViewDidLoad

你可以看到在行動這款N-25 - https://github.com/MvvmCross/NPlus1DaysOfMvvmCross/blob/976ede3aafd3a7c6e06717ee48a9a45f08eedcd0/N-25-Tabbed/Tabbed.Touch/Views/FirstView.cs#L17

喜歡的東西:

public class MainView : MvxTabBarViewController 
{ 
    private bool _constructed; 

    public MainView() 
    { 
      _constructed = true; 

      // need this additional call to ViewDidLoad because UIkit creates the view before the C# hierarchy has been constructed 
      ViewDidLoad(); 
    } 

    public override void ViewDidLoad() 
    { 
     if (!_constructed) 
      return; 

     base.ViewDidLoad(); 

     var vm = (MainViewModel)this.ViewModel; 
     if (vm == null) 
      return; 
    } 
} 
+0

我只是碰到了這個上MvvmCross.Mac。 – tofutim

+0

從構造函數調用'ViewDidLoad()'會給出一個關於「虛擬成員調用」的警告,所以應該封閉類以避免它。 –