1

Je tente de créer un UITabBarController qui implémente un UINavigationBar, ce que je ferais dans Xcode en quelques minutes. Cependant, j'ai du mal à utiliser MVVMCross avec MonoTouch. Une partie du code est ci-dessous -MVVMCross MonoTouch UITabBarController ne peut pas accéder à la barre de navigation

Dès le premier VC (ce qui est pour l'utilisateur d'accepter des conditions & conditions, donc une fois accepté, il n'y a pas d'option pour y revenir, d'où le vrai drapeau) -

this.RequestNavigate<TabHostViewModel>(true); 

Mon tabBar est mis en place comme si, ce qui fonctionne très bien -

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

... etc.

J'essaie de mettre en place la première vue (AccueilVoir dans ce cas), comme si dans viewDidLoad -

this.NavigationController.NavigationBar.TintColor = myNavBarColour; 

Cependant, il semble que NavigationController dans indéfini, à moins que je crée mon propre quand je mis en place 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), 
}; 

maintenant, je peux faire ce que je veux avec la barre de navigation, mais le problème est que j'ai deux barres de navigation, un en haut, sans titre, et la nouvelle que je viens de créer immédiatement au-dessous .

Toute personne ayant des pensées?

Merci beaucoup.

+0

Je ne suis pas tout à fait clair sur votre configuration. Cependant, je pense que vous ne devriez pas avoir une barre de navigation au niveau de la maison - vous devriez plutôt avoir des barres de navigation individuelles dans chaque onglet. C'est ce que fait l'exemple de la conférence - http://slodge.blogspot.co.uk/2012/03/update-on-mvvmcross-sqlbits-conference.html et https://github.com/slodge/MvvmCross/tree/ master/Sample% 20-% 20CirriousConference – Stuart

+0

Merci Stuart - Je travaille maintenant sur le code. Malheureusement, l'application ne fonctionne pas, elle plante sur base.ViewDidLoad() dans UpdateView. – SomaMan

+0

Hmmm ... quelle version de MonoTouch ... il a fonctionné ... même dans l'App Store ... argh – Stuart

Répondre

0

Je ne suis pas entièrement clair sur votre configuration.

Cependant, je pense que ce que vous cherchez est ce que l'échantillon de conférence ne

Dans cet exemple:

  • les hôtes de vue de la maison le tabbar
  • chaque languette a son propre intégré NavigationController
  • chaque sous-vue est hébergé à l'intérieur de l'un des contrôleurs de navigation

Ce code est:

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]; 
    } 

La navigation est ensuite intercepté à l'intérieur de la logique présentateur (configuré le AppDelegate) - la ConferencePresenter reporte la logique 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; 
    } 

Cette logique est un peu compliquée, mais le but de cette conception de navigation et présentateur est de vous permettre de personnaliser la présentation en fonction de l'application. Cela peut également être modifié dynamiquement au moment de l'exécution - vous pouvez donc, par exemple, choisir d'utiliser une logique de présentation différente sur un iPad au lieu d'un iPhone.

Questions connexes