在 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;
}
}
我在 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;
}
}