MVVMCross MonoTouch UITabBarController无法访问导航栏

时间:2012-06-11 14:23:05

标签: uinavigationcontroller xamarin.ios uitabbarcontroller mvvmcross

我正在尝试创建一个实现UINavigationBar的UITabBarController,这是我在Xcode中在几分钟内完成的事情。但是,我正在努力使用MVVMCross和MonoTouch。部分代码如下 -

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

this.RequestNavigate<TabHostViewModel>(true);

我的tabBar设置如此,工作正常 -

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

...等

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

this.NavigationController.NavigationBar.TintColor = myNavBarColour;

然而,似乎NavigationController在undefined中,除非我在设置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),
};

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

有任何想法的人吗?

非常感谢。

1 个答案:

答案 0 :(得分: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上使用不同的表示逻辑。