TabBarViewController不能显示为子项。考虑使用Root代替

时间:2017-06-07 16:27:26

标签: xamarin.ios mvvmcross

在我的iOS应用程序开始时(我正在使用Xamarin和MvvmCross构建),我想立即将UIViewController更改为UITabBarViewController。我的代码:

public class MainViewModel : BaseViewModel
{
    public void Initialization()
    {
        ShowViewModel<TabLayoutViewModel>(); // Breaks here
    }
}

public class MainViewController : BaseViewController<MainViewModel>
{
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        this.ViewModel.Initialization();
    }
}

public class TabLayoutViewController : MvxTabBarViewController<TabLayoutViewModel>
{
}

ShowViewModel<TabLayoutViewModel>()行,它会引发异常:

  

TabBarViewController无法显示为子项。考虑使用   取而代之的是

我只想将此控制器推到堆栈顶部。我知道这在普通的iOS中是合法的,所以应该有办法用MvvmCross吗?

2 个答案:

答案 0 :(得分:3)

更新:由于MvvmCross 5.0.4,现在可以将TabBarController显示为子项。只需使用[MvxChildPresentation]标记您的TabBarController。

请参阅此PR源代码..

原始答案:

A TabBarController并不意味着在UINavigationController中呈现。你可以做的是更改窗口的根ViewController。为此,您可以在TabLayoutViewController类之上添加MvxRootPresentation属性。

如果确实需要在UINavigationController中显示标签,可能会发现this question相关。

答案 1 :(得分:2)

上周我必须这样做。

我要快速解决这个问题很简单:

1)创建一个继承自MvxIosViewPresenter(https://github.com/MvvmCross/MvvmCross/blob/develop/MvvmCross/iOS/iOS/Views/Presenters/MvxIosViewPresenter.cs)的自定义演示者。

2)覆盖ShowChildViewController方法,使用原始模型并注释这两行:

if (viewController is IMvxTabBarViewController)
    throw new MvxException("A TabBarViewController cannot be presented as a child. Consider using Root instead");

3)覆盖Setup.cs中的CreatePresenter方法:

protected override IMvxIosViewPresenter CreatePresenter()
{
    return new CustomTabChildMvxIosViewPresenter(ApplicationDelegate, Window);
}