Как установить счетчик значков над панелью инструментов в Xamarin.Forms? - PullRequest
0 голосов
/ 26 июня 2019

Я создаю приложение, в котором мне нужно реализовать счетчик значков над значком в ToolbarItem.Я создаю службу зависимости для IOS и Android.Я ссылаюсь на этот URL .

После реализации этого я получаю идеальный результат в Android, но когда я пытаюсь запустить его на устройстве IOS, я не могу его использовать.При этом

var rightButtonItems = vc?.ParentViewController?.NavigationItem?.RightBarButtonItems;

всегда возвращает ноль, поэтому я не могу использовать и устанавливать счетчик значков над приложением.

Я использую стандартную библиотеку классов .Net.У меня та же проблема, что и здесь .

Мой код:

Badge.xaml

<ContentPage.ToolbarItems>
    <ToolbarItem Icon="notification" Name="MenuItem1" Order="Primary" Priority="0" Text="Notification" Clicked="ToolbarItem_Clicked"/>
</ContentPage.ToolbarItems>

Badge.xaml.cs

private void ToolbarItem_Clicked(object sender, EventArgs e)
{
    Navigation.PushAsync(new Notification());
}
private void ContentPage_Appearing(object sender, EventArgs e)
{
    base.OnAppearing();
    ViewModel.AppearingCommand?.Execute(null);
    if (ToolbarItems.Count > 0)
        DependencyService.Get<IToolbarItemBadgeService>().SetBadge(this, ToolbarItems.First(), "4", Color.Red, Color.White);
}

IToolbarItemBadgeService.cs (в общем проекте)

public interface IToolbarItemBadgeService
{
    void SetBadge(Page page, ToolbarItem item, string value, Color backgroundColor, Color textColor);
}

ToolbarItemBadgeService.cs (в проекте iOS)

[assembly: Dependency(typeof(ToolbarItemBadgeService))]
namespace CustomerServiceApp.iOS
{
    public class ToolbarItemBadgeService :  IToolbarItemBadgeService
    {

        public void SetBadge(Page page, ToolbarItem item, string value, Color backgroundColor, Color textColor)
        {
            Device.BeginInvokeOnMainThread(() =>
            {
                var renderer = Platform.GetRenderer(page);
                if (renderer == null)
                {
                    renderer = Platform.CreateRenderer(page);
                    Platform.SetRenderer(page, renderer);
                }
                var vc = renderer.ViewController;
                var rightButtonItems = vc?.ParentViewController?.NavigationItem?.RightBarButtonItems;//Here i get null in rightButtonItems
                // If we can't find the button where it typically is check the child view controllers
                // as this is where MasterDetailPages are kept
                if (rightButtonItems == null && vc.ChildViewControllerForHomeIndicatorAutoHidden != null)//vc.ChildViewControllerForHomeIndicatorAutoHidden is also return null
                    foreach (var uiObject in vc.ChildViewControllerForHomeIndicatorAutoHidden)
                    {
                        string uiObjectType = uiObject.GetType().ToString();
                        if (uiObjectType.Contains("FormsNav"))
                        {
                            UIKit.UINavigationBar navobj = (UIKit.UINavigationBar)uiObject;

                            if (navobj.Items != null)
                                foreach (UIKit.UINavigationItem navitem in navobj.Items)
                                {
                                    if (navitem.RightBarButtonItems != null)
                                    {
                                        rightButtonItems = navitem.RightBarButtonItems;
                                        break;
                                    }
                                }
                        }
                    }
                var idx = page.ToolbarItems.IndexOf(item);
                if (rightButtonItems != null && rightButtonItems.Length > idx)
                {
                    var barItem = rightButtonItems[idx];
                    if (barItem != null)
                    {
                        barItem.UpdateBadge(value, backgroundColor.ToUIColor(), textColor.ToUIColor());
                    }
                }
            });
        }
    }
}

I want this as a sample output and also mention as current status of that. Кто-нибудь может посмотреть на это и предложить мне, что я должен сделать в этом?

...