在我的Xamarin.iOS应用程序(使用MvvmCross)中,我注册了一个自定义AppStart,它根据用户是否已经登录来启动登录屏幕或主屏幕。我正在使用EntityFrameworkCore来存储用户数据并且在启动时从数据库加载信息可以正常工作,该问题是在从AppStart调用await NavigationService.Navigate<MainViewModel()
之后出现的。
我在调试器中收到一条消息,指出MvvmCross导航(iOSNavigation
),紧随其后的是Request is null - assuming this is a TabBar type situation where ViewDidLoad is called during construction... patching the request now - but watch out for problems with virtual calls during construction
,据我从在线研究中得知,这是正常现象。但是,视图永远不会出现,并且应用程序仍然停留在启动/启动屏幕上。
我的MainViewController(与MainViewModel对应)继承自MvxTabBarViewController,并具有以下表示属性:[MvxRootPresentation(AnimationOptions = UIViewAnimationOptions.TransitionCrossDissolve | UIViewAnimationOptions.CurveEaseInOut, WrapInNavigationController = true)]
。
MainViewController的唯一构造函数是:
public MainViewController()
: base()
{
// No call to ViewDidLoad here as base() seems to do it for me.
}
在我的Xamarin.Android项目中一切正常,所以我猜它在iOS方面。
MvvmCross 6.3.1。
编辑
要显示的选项卡在MainViewController的ViewDidLoad中创建:
public override void ViewDidLoad()
{
base.ViewDidLoad();
if (ViewModel == null)
return;
// There are 3 ViewControllers, all created this way.
var viewControllerOne = new ViewControllerOne
{
ViewModel = ViewModel.ViewModelOne,
TabBarItem = new UITabBarItem(ViewModel.ViewModelOne.Title, UIImage.FromBundle("Icon1"), 0)
};
ViewControllers = new UIViewController[]
{
viewControllerOne,
viewControllerTwo,
viewControllerThree
};
}
每个选项卡都继承自MvxViewController,并具有[MvxTabPresentation]
演示文稿属性。每个选项卡的构造函数为:
public ViewControllerOne() // One, Two, Three
: base("ViewOne", null) // One, Two, Three
{
// None of the tab views currently have any bindings to ViewModels,
just a UILabel constrained to the centre of the view for testing purposes.
}
我尝试在主线程上运行初始导航逻辑,没有任何区别。这是我在MvxAppStart.NavigateToFirstViewModel内完成的操作:
await Mvx.IoCProvider.Resolve<IMvxMainThreadAsyncDispatcher>().ExecuteOnMainThreadAsync(() =>
{
if (isLoggedIn)
NavigationService.Navigate<MainViewModel>().GetAwaiter().GetResult();
else
NavigationService.Navigate<LoginViewModel>().GetAwaiter().GetResult();
});
答案 0 :(得分:0)
我看到您设置标签的方式存在一些问题。
首先,在您的ViewDidLoad中,以下行可能有问题:
if (ViewModel == null)
return;
您不应该这样做。如果代码执行达到该return;
,则该方法中的其余代码将永远不会执行。
在此处查看示例代码:https://github.com/pnavk/Xamarin.iOS.MvvmCross.Tabs
希望有帮助。
答案 1 :(得分:0)
问题是我的ViewModel逻辑阻塞了主线程。
在我的MainViewModel
中,我重写了Initialize
任务以从API异步加载数据以显示各个选项卡。
最初,我应该使用IMvxMainThreadAsyncDispatcher
方法MvxViewModel
和InvokeOnMainThread
来使用InvokeOnMainThreadAsync
在主线程上运行事情。现在,我正在使用这些应用程序,可以正常启动。
感谢Cheesebaron试图帮助我的每个人,特别感谢我为阻止主线程指明了正确的方向。