在我的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吗?
答案 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);
}