如何更新Xamarin.Forms.iOS中的tabbar badge-icon?

时间:2018-01-01 17:37:26

标签: xamarin xamarin.forms xamarin.ios

如果我在ViewWillAppear函数中直接使用徽章,我可以成功使用我的标签栏上的徽章但如果我创建了一个功能,我试图控制它,那么徽章就不会出现。

这是tabbedpaged渲染器,我必须使用更改徽章的功能。

    public override void ViewWillAppear(bool animated)
    {
        if (TabBar == null) return;
        if (TabBar.Items == null) return;

        var tabs = Element as TabbedPage;
        if (tabs != null)
        {
            for (int i = 0; i < TabBar.Items.Length; i++)
            {
                UpdateItem(TabBar.Items[i], tabs.Children[i].Icon);
            }
        }

        base.ViewWillAppear(animated);
    }

    private void UpdateItem(UITabBarItem item, string icon)
    {
        TabBar.UnselectedItemTintColor = UIColor.White;
    }

    public void UpdateBadge ()
    {
        var tabs = Element as TabbedPage;
        if (tabs != null)
        {
            Device.BeginInvokeOnMainThread(() =>
            {
                var tab = TabBar.Items[3];
                tab.BadgeValue = "New";
                tab.BadgeColor = UIColor.Red;
            });

        }
    }

然后我有另一个文件来处理推送,这就是我调用UpdateBadge函数来推送通知并更新应用程序徽章的地方。

    void IPush.SendPush()
    {
        var notification = new UILocalNotification();
        notification.SoundName = UILocalNotification.DefaultSoundName;
        UIApplication.SharedApplication.PresentLocalNotificationNow(notification);

        TabbedPage_Renderer tpr = new TabbedPage_Renderer();
        tpr.UpdateBadge();
    }

但如上所述,这并没有添加徽章。

如果我加上......

var tab = TabBar.Items[3];
tab.BadgeValue = "New";
tab.BadgeColor = UIColor.Red;

...直接在ViewWillAppear内,当我启动应用程序时它成功显示了一个iconbadge但想法是控制它,这样我就可以随时更新徽章。

1 个答案:

答案 0 :(得分:0)

我们不应该直接使用Renderer的实例。

如果您想更改平台渲染器中的UI,我们可以尝试在表单中定义BindableProperty。然后告诉渲染器在此属性更改时进行一些配置。

首先,在页面中定义一个要更改其徽章的BindableProperty,如:

public static readonly BindableProperty BadgeTextProperty = BindableProperty.Create(nameof(BadgeText), typeof(string), typeof(MainPage), "0");
public string BadgeText {
    set
    {
        SetValue(BadgeTextProperty, value);
    }
    get
    {
        return (string)GetValue(BadgeTextProperty);
    }
}

其次,在渲染器中,我们可以在此属性更改时设置徽章文本,如:

for (int i = 0; i < TabBar.Items.Length; i++)
{
    UpdateItem(TabBar.Items[i], tabs.Children[i].Icon);
    //register the property changed event
    tabs.Children[i].PropertyChanged += TabbarPageRenderer_PropertyChanged;
}
private void TabbarPageRenderer_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    var page = sender as Page;
    if (page == null)
        return;

    if (e.PropertyName == "BadgeText")
    {
        if (CheckValidTabIndex(page, out int tabIndex))
        {
            switch(tabIndex)
            {
                case 0:
                    UpdateBadge(TabBar.Items[tabIndex], (page as MainPage).BadgeText);
                    break;
                case 1:
                    //Second Page, you can expand this switch depending on your tabs children

                    UpdateBadge(TabBar.Items[tabIndex], (page as SecondPage).BadgeText);
                    break;
                default:
                    break;
            }
        }   
        return;
    }
}
public bool CheckValidTabIndex(Page page, out int tabIndex)
{
    tabIndex = Tabbed.Children.IndexOf(page);
    return tabIndex < TabBar.Items.Length;
}
private void UpdateItem(UITabBarItem item, string icon)
{
    TabBar.UnselectedItemTintColor = UIColor.White;
    ...//set the tabItem
}
private void UpdateBadge(UITabBarItem item, string badgeText)
{
    item.BadgeValue = text;
    item.BadgeColor = UIColor.Red;
}

最后,如果要更新徽章,请在表单中设置BadgeText。