在 ViewDidLoad 期间 ViewModel 为空

ViewModel is null during ViewDidLoad

我在 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 在构造函数调用期间为 null,但在默认的 ViewDidLoad 调用中有效。但这看起来像是一种解决方法。有人可以帮忙吗?

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

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

TabBarViewController 的情况下,这发生在 iOS 基本视图构造函数期间 - 即它发生在 之前 class 本身已经有它的构造函数调用。

我发现的解决此问题的唯一方法是针对 ViewDidLoad 中的情况添加检查,并在 class 构造函数期间再次调用 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;
    }
}