2015-05-15 2 views
4

Я начинаю работу с MvvmCross в iOS.ViewModel имеет значение null во время ViewDidLoad

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

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

Установка точки останова в строке, где доступ к ViewModel, показывает мне, что ViewModel равна нулю.

Я могу обходить это путем вызова ViewDidLoad() в конструкторе. Затем ViewModel имеет значение null во время вызова конструктора, но действует по умолчанию по умолчанию: 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()' из конструктора дает предупреждение о «вызове виртуального участника», поэтому класс следует запечатать, чтобы избежать его. –

Смежные вопросы