2016-07-27 2 views
11

Je peux créer un simple Renderer Tab qui mettra à jour mes ToolBarItems Forms pour utiliser les icônes iOS intégrées comme ci-dessous.Xamarin Forms iOS Renderer - Icônes standard ToolBar

NavigationController est seulement pas NULL dans ViewWillAppear Si j'essaie dans ViewDidLoad, il est NULL.

Le problème avec ceci est que vous obtenez un éclair du texte de l'élément TabBar avant qu'il ne soit remplacé par l'icône actuelle.

Y a-t-il un autre endroit où je devrais intercepter le comportement de la barre d'outils?

[assembly: ExportRenderer(typeof(TabbedPage), typeof(TabRenderer))] 
namespace Cellar.iOS.Renders 
{ 
    public class TabRenderer : TabbedRenderer 
    { 
     public override void ViewWillAppear(bool animated) 
     { 
      base.ViewWillAppear(animated); 

      var list = new List<UIBarButtonItem>(); 

      foreach (var item in NavigationController.TopViewController.NavigationItem.RightBarButtonItems) 
      { 
       if (string.IsNullOrEmpty(item.Title)) 
       { 
        continue; 
       } 

       if (item.Title.ToLower() == "add") 
       { 
        var newItem = new UIBarButtonItem(UIBarButtonSystemItem.Add) 
        { 
         Action = item.Action, 
         Target = item.Target 
        }; 

        list.Add(newItem); 
       } 

       if (list.Count > 0) 
        NavigationController.TopViewController.NavigationItem.RightBarButtonItems = list.ToArray(); 
      } 
     } 
    } 
} 
+0

Essayez de déplacer le 'base.ViewWillAppear (animé); 'à la fin –

+0

Cela ne fonctionne pas, merci cependant. – aherrick

+0

Avez-vous ce flash sur un simulateur ou un appareil réel? –

Répondre

1

méthode remplacement OnElementChanged:

protected override void OnElementChanged(VisualElementChangedEventArgs e) 
    { 
     base.OnElementChanged(e); 

     if(e.NewElement!= null) 
     { 
      var list = new List<UIBarButtonItem>(); 

      // Your code goes here 
     } 
    } 
+0

cela ne fonctionne pas. NavigationController est NULL à ce stade. – aherrick

1

Oui, vous devez remplacer le PushViewController et hériter de la méthode NavigationRenderer. Voici ce que je me sers dans ma demande:

public class CustomToolbarRenderer : NavigationRenderer 
{ 
    public override void PushViewController(UIViewController viewController, bool animated) 
    { 
     base.PushViewController(viewController, animated); 

     List<UIBarButtonItem> newItems = new List<UIBarButtonItem>(); 

     foreach (UIBarButtonItem i in TopViewController.NavigationItem.RightBarButtonItems) 
     { 
      if (i.Title != null) 
      { 
       if (i.Title.Equals(Constants.Toolbar.Add)) 
       { 
        var newItem = new UIBarButtonItem(UIBarButtonSystemItem.Add); 
        newItem.Action = i.Action; 
        newItem.Target = i.Target; 

        newItems.Add(newItem); 
       } 
       else if (i.Title.Equals(Constants.Toolbar.Camera)) 
       { 
        var newItem = new UIBarButtonItem(UIBarButtonSystemItem.Camera); 
        newItem.Action = i.Action; 
        newItem.Target = i.Target; 

        newItems.Add(newItem); 
       } 
       else if (i.Title.Equals(Constants.Toolbar.Delete)) 
       { 
        var newItem = new UIBarButtonItem(UIBarButtonSystemItem.Trash); 
        newItem.Action = i.Action; 
        newItem.Target = i.Target; 

        newItems.Add(newItem); 
       } 
       else 
        newItems.Add(i); 
      } 
      else 
       newItems.Add(i); 
     } 

     TopViewController.NavigationItem.RightBarButtonItems = newItems.ToArray(); 
    } 
} 
+0

merci, mais cela ne fonctionne pas pour la commutation de tabulation. Voir mon exemple d'application ci-dessus. – aherrick

1

Essayez le code ci-dessous à la fin ou après l'exécution du bloc de code requis ...

return base.ViewWillAppear(animated);