MvxTabBarViewController作为第一个ViewController没有出现

时间:2019-08-08 11:11:15

标签: c# ios xamarin mvvmcross

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

2 个答案:

答案 0 :(得分:0)

我看到您设置标签的方式存在一些问题。

首先,在您的ViewDidLoad中,以下行可能有问题:

    if (ViewModel == null)
    return;

您不应该这样做。如果代码执行达到该return;,则该方法中的其余代码将永远不会执行。

在此处查看示例代码:https://github.com/pnavk/Xamarin.iOS.MvvmCross.Tabs

希望有帮助。

答案 1 :(得分:0)

问题是我的ViewModel逻辑阻塞了主线程。

在我的MainViewModel中,我重写了Initialize任务以从API异步加载数据以显示各个选项卡。

最初,我应该使用IMvxMainThreadAsyncDispatcher方法MvxViewModelInvokeOnMainThread来使用InvokeOnMainThreadAsync在主线程上运行事情。现在,我正在使用这些应用程序,可以正常启动。

感谢Cheesebaron试图帮助我的每个人,特别感谢我为阻止主线程指明了正确的方向。