2016-07-27 26 views
11

Potrafię stworzyć proste narzędzie Tab Renderer, które zaktualizuje moje narzędzia Forms ToolBarItems do korzystania z wbudowanych ikon systemu iOS, jak poniżej.Xamarin Forms iOS Renderer - Toolbar Standardowe ikony

NavigationController jest NIE tylko NULL w ViewWillAppear Gdy próbuję go w ViewDidLoad, to NULL.

Problem polega na tym, że dostajesz błysk tekstu TabBar, zanim zostanie on zastąpiony rzeczywistą ikoną.

Czy jest inne miejsce, w którym powinienem przechwycić zachowanie paska narzędziowego?

[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

Spróbuj przesunąć 'base.ViewWillAppear (animowany); 'do końca –

+0

To nie działa, dziękuję. – aherrick

+0

Czy otrzymujesz tę lampę błyskową na symulatorze lub na prawdziwym urządzeniu? –

Odpowiedz

1

przesłanianie OnElementChanged metoda:

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

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

      // Your code goes here 
     } 
    } 
+0

to nie działa. NavigationController ma wartość NULL w tym momencie. – aherrick

1

Tak, należy zastąpić PushViewController i dziedziczą NavigationRenderer metody. Oto co używam w mojej aplikacji:

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

dzięki, ale to nie działa w przypadku przełączania kart. Zobacz moją przykładową aplikację powyżej. – aherrick

1

Try poniższy kod na końcu lub po wykonaniu wymaganego bloku kodu ...

return base.ViewWillAppear(animated); 
Powiązane problemy