ViewDidLoad期间ViewModel为null

时间:2015-05-15 08:36:55

标签: ios xamarin mvvmcross

我开始使用iOS中的MvvmCross。

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

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

设置断点到访问ViewModel的行,显示ViewModel为空。

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

1 个答案:

答案 0 :(得分: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;
    }
}