1

我正在尝试创建一个实现 UINavigationBar 的 UITabBarController,这是我在 Xcode 中几分钟内要做的事情。但是,我正在努力将 MVVMCross 与 MonoTouch 一起使用。一些代码如下 -

从第一个 VC 开始(这是为了让用户接受条款和条件,所以一旦接受,就没有选择返回它,因此是 true 标志) -

this.RequestNavigate<TabHostViewModel>(true);

我的 tabBar 是这样设置的,效果很好 -

ViewControllers = new UIViewController[]
{
    CreateTabFor("Home", "", ViewModel.homeViewModel),
    CreateTabFor("History", "", ViewModel.journeyHistoryViewModel),
    CreateTabFor("Contacts", "", ViewModel.contactsViewModel),
    CreateTabFor("About", "", ViewModel.aboutViewModel),
};

...ETC。

我尝试在 ViewDidLoad 中设置第一个视图(在本例中为 HomeView)-

this.NavigationController.NavigationBar.TintColor = myNavBarColour;

但是,似乎 NavigationController 未定义,除非我在设置 TabBar 时创建自己的 -

UIViewController HomeViewController = CreateTabFor("Home", "", ViewModel.homeViewModel);
UINavigationController HomeNavController = new UINavigationController(HomeViewController);

ViewControllers = new UIViewController[]
{
    HomeNavController,
    CreateTabFor("History", "", ViewModel.journeyHistoryViewModel),
    CreateTabFor("Contacts", "", ViewModel.contactsViewModel),
    CreateTabFor("About", "", ViewModel.aboutViewModel),
};

现在我可以用导航栏做任何我喜欢的事情,但问题是我有两个导航栏,一个在顶部没有标题,另一个是我刚刚在它下面创建的新导航栏。

有任何想法的人吗?

非常感谢。

4

1 回答 1

0

我对你的设置并不完全清楚。

但是,我认为您正在寻找的是会议样本的作用

在此示例中:

  • 主视图承载标签栏
  • 每个选项卡都有自己的嵌入式 NavigationController
  • 每个子视图都托管在其中一个导航控制器中

这段代码是:

    private UIViewController CreateTabFor(string title, string imageName, IMvxViewModel viewModel)
    {
        var controller = new UINavigationController();
        controller.NavigationBar.TintColor = UIColor.Black;
        var screen = this.CreateViewControllerFor(viewModel) as UIViewController;
        SetTitleAndTabBarItem(screen, title, imageName);
        controller.PushViewController(screen, false);
        return controller;
    }

    private void SetTitleAndTabBarItem(UIViewController screen, string title, string imageName)
    {
        screen.Title = ViewModel.TextSource.GetText(title);
        screen.TabBarItem = new UITabBarItem(title, UIImage.FromBundle("Images/Tabs/" + imageName + ".png"),
                                             _createdSoFarCount);
        _createdSoFarCount++;
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        if (ViewModel == null)
        {
            _needViewDidLoadCall = true;
            return;
        }

        _needViewDidLoadCall = false;

        var viewControllers = new UIViewController[]
                              {
                                CreateTabFor("Welcome", "home", ViewModel.Welcome),
                                CreateTabFor("Sessions", "sessions", ViewModel.Sessions),
                                CreateTabFor("Favorites", "favorites", ViewModel.Favorites),
                                CreateTabFor("Tweets", "twitter", ViewModel.Twitter),
                              };
        ViewControllers = viewControllers;
        CustomizableViewControllers = new UIViewController[] { };
        SelectedViewController = ViewControllers[0];
    }

然后在 Presenter 逻辑(在 AppDelegate 中配置)中截获导航 - ConferencePresenter将 ShowView 逻辑推迟到:

    public bool ShowView(IMvxTouchView view)
    {
        if (TryShowViewInCurrentTab(view))
            return true;

        return false;
    }

    private bool TryShowViewInCurrentTab(IMvxTouchView view)
    {
        var navigationController = (UINavigationController)this.SelectedViewController;
        navigationController.PushViewController((UIViewController)view, true);
        return true;
    }

这个逻辑有点复杂,但是这个导航和演示器设计的目的是允许您自定义演示以适应应用程序。这也可以在运行时动态更改 - 例如,您可以选择在 iPad 而不是 iPhone 上使用不同的表示逻辑。

于 2012-06-13T11:40:34.320 回答