Xamarin.iOS,MVVMCross我可以从TabBarController的根ViewController访问NavigationItem吗?

问题描述

我使用Xamarin.iOS和MVVMCross。我的应用程序的体系结构如下:

              +-----------------------+
              | Rootviewmodel         |
              | RootViewController    |
              | [MvxRootPresentation] |
              |                       |
              +--------+----+---------+
                       |    |
           +-----------+    +------------+
           |                             |
+----------+----------+      +-----------+---------+
|Tab1viewmodel        |      |Tab2viewmodel        |
|Tab1ViewController   |      |Tab2ViewController   |
|[MvxTabPresentation] |      |[MvxTabPresentation] |
|                     |      |                     |
+---------------------+      +---------------------+

问题是,导航栏在选项卡ViewController中设置。我必须在NavigationItem.Title上显示一些信息,该信息存储在Rootviewmodel中。我可以拥有一个在RootViewController中初始化的通用导航栏吗? 或者如果无法实现,我可以从TabViewController访问Rootviewmodel吗?

解决方法

  1. RootViewController中,将修饰添加到类中。
[MvxRootPresentation(WrapInNavigationController = true)]
public partial class RootViewController : MvxTabBarViewController<RootViewModel>
  1. 在标签控制器中添加修饰符:
[MvxTabPresentation(WrapInNavigationController = false,TabName = "Tab1Title",TabIconName = "Tab1Icon")]
public partial class Tab1ViewController : ViewController<Tab1ViewModel>
  1. 在标签控制器中,还应在ViewDidLoad中添加它以隐藏单个导航栏:
public override void ViewDidLoad()
{
    base.ViewDidLoad();
    if (NavigationController != null && NavigationController.NavigationBar != null)
    {
        NavigationController.NavigationBar.Hidden = true;
    }
}

奖金。您可以在RootViewController

中更改标签标题的翻译
protected override void SetTitleAndTabBarItem(UIViewController viewController,MvxTabPresentationAttribute attribute)
{
    attribute.TabName = _yourLocalizationService.Translate(attribute.TabName);
    base.SetTitleAndTabBarItem(viewController,attribute);
}