ViewDidLoad期间ViewModel为null

ess*_*kar 5 ios mvvmcross xamarin

我开始在iOS中使用MvvmCross.

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

        var vm = (MainViewModel)this.ViewModel;
        if (vm == null)
            return;
    }
}
Run Code Online (Sandbox Code Playgroud)

将断点设置为访问的行ViewModel,显示ViewModel为null.

我可以通过调用ViewDidLoad()构造函数来解决这个问题.然后,ViewModel 在构造函数调用期间为null,但在默认ViewDidLoad调用中有效.但这看起来像是一种解决方法.任何人都可以帮忙吗?

Stu*_*art 6

我在这里猜测这里的问题将特定于TabBarViewController构造的方式.

ViewDidLoad 是一个虚方法,它是第一次访问View时调用.

如果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;
    }
}
Run Code Online (Sandbox Code Playgroud)