Значок не отображается на элементе панели вкладок, если он установлен в обратном вызове уведомления

Я пытаюсь установить значок на панели вкладок на «1» на 4-й вкладке, когда мое приложение получает уведомление. Как ни странно, моя консоль говорит, что метод срабатывает (см. NSLog «Огонь!»), Однако значок не появляется на моем элементе панели вкладок после получения уведомления? Я что-то упускаю?

AppDelegate.m

-(void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo 

    UIApplicationState state = [application applicationState];
    if (state == UIApplicationStateActive) {

        [[NSNotificationCenter defaultCenter] postNotificationName:@"pushNotification" object:nil userInfo:userInfo];

        NSLog(@"App notification received!");
        // do stuff when app is active

    }else{
        // do stuff when app is in background

        static int i=1;
        [UIApplication sharedApplication].applicationIconBadgeNumber = i++;

        NSLog(@"App notification received background!");
    }
}

ViewController.m

- (void) myNotificationReceived:(NSNotification *) notification {


    [[self.tabBarController.tabBar.items objectAtIndex:3] setBadgeValue:@"1"];


    NSLog(@"Fire!");
}


- (void)viewDidLoad {
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myNotificationReceived:) name:@"pushNotification" object:nil];

}

person Brittany    schedule 28.07.2017    source источник
comment
Несколько предложений: что происходит, когда вы звоните [[self.tabBarController.tabBar.items objectAtIndex:4] setBadgeValue:@"1"] из viewDidLoad? Эта строка вызывается из основного потока? Возможно, у вас есть вкладка «Дополнительно...»?   -  person meaning-matters    schedule 28.07.2017
comment
содержит ›= 5 элементов objectAtIdex: создает исключение для индексов за пределами границ.   -  person jscs    schedule 28.07.2017
comment
попробуйте это [[self.tabBarController.tabBar.items objectAtIndex:2] setBadgeValue:@1]; появляется ли 1 в жестко запрограммированном индексе?   -  person Mohammad Bashir Sidani    schedule 28.07.2017
comment
Обратите внимание, что вы пытаетесь установить 5-ю вкладку, а не 4-ю.   -  person meaning-matters    schedule 28.07.2017
comment
@BashirSidani Пробовал это, все еще не появляется 1. Хотя мой NSLog Fire! все еще отображается в консоли, что заставляет меня поверить, что метод выполняется.   -  person Brittany    schedule 28.07.2017
comment
@meaning-matters также пробовал код с objectAtIndex 3, но значок все еще не появлялся.   -  person Brittany    schedule 28.07.2017
comment
@meaning-matters Как ни странно, когда я помещаю ту же строку в viewDidLoad контроллера, значок тоже не появляется?   -  person Brittany    schedule 28.07.2017
comment
Остановите отладчик inviewDidLoad и напечатайте (используя команду po) self.tabBarController.tabBar.items. Что вы получаете?   -  person meaning-matters    schedule 28.07.2017
comment
вы делаете это в делегате приложения. это означает, что вы пытаетесь добавить значок еще до загрузки контроллера UItabbar. Вам нужно сделать это после того, как UITabbarcontroller будет инициирован в viewdidload.   -  person Mohammad Bashir Sidani    schedule 28.07.2017
comment
@BashirSidani Но AppDelegate пытается запустить метод nsnotification только при получении уведомления? Что происходит после загрузки панели вкладок и открытия приложения? Кроме того, см. Комментарий выше — если я установлю номер значка в viewDidLoad, он тоже не появится?   -  person Brittany    schedule 28.07.2017
comment
имеет смысл, попробуйте поместить свою строку кода сразу после запуска контроллера UItabbar (и после добавления его элементов), видите ли вы его обновление?   -  person Mohammad Bashir Sidani    schedule 28.07.2017
comment
@ Brittany Вы пробовали с UITabBarController *tabController = (UITabBarController *)self.window.rootViewController; Тогда вы можете установить значок как [[tabController.viewControllers objectAtIndex:3] tabBarItem].badgeValue = @"1"; ?   -  person Piyush    schedule 29.07.2017
comment
вызовите postNotificationName с помощью таймера.... Вызовите его через 1 сек. ..... Чтобы UITab успел инициализироваться... На всякий случай...   -  person Kusal Shrestha    schedule 31.07.2017
comment
@PiyushPatel Добавил строку self.window.rootViewController в мой метод уведомления, но кубиков по-прежнему нет.   -  person Brittany    schedule 01.08.2017
comment
@PiyushPatel Добавил строку self.window.rootViewController в мой AppDelegate, и теперь это работает - спасибо!! Если вы хотите опубликовать это как ответ, я приму это :)   -  person Brittany    schedule 01.08.2017


Ответы (2)


[[self.tabBarController.tabBar.items objectAtIndex:0] setBadgeValue:nil]; установите свой счет или число вместо нуля, чтобы показать на панели вкладок

попробуй это может тебе поможет

person AmitTiwari    schedule 29.07.2017

Метод NSNotification не требуется — проблема в AppDelegate.m устранена следующим образом:

-(void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo {

    UIApplicationState state = [application applicationState];
    if (state == UIApplicationStateActive) {

        [[NSNotificationCenter defaultCenter] postNotificationName:@"pushNotification" object:nil userInfo:userInfo];

        UITabBarController *tabController = (UITabBarController *)self.window.rootViewController;
        [[tabController.viewControllers objectAtIndex:4] tabBarItem].badgeValue = @"1";


        NSLog(@"App notification received!");
        // do stuff when app is active

    }else{


        static int i=1;
        [UIApplication sharedApplication].applicationIconBadgeNumber = i++;

        //  NSLog(@"App notification received!");

        NSLog(@"App notification received background!");
    }
}
person Brittany    schedule 03.08.2017