iOS: cambio de la insignia de la barra de tabs de otra class

He buscado mucho pero no pude encontrar una respuesta y por lo tanto decidí preguntarte :).

Tengo una aplicación con algunas vistas. Después de iniciar session, creo un UITabBarController con 3 tabs.

Ahora deseo cambiar la insignia de la segunda pestaña según cuántas notifications tenga el usuario.

Este núcleo funciona cuando se llama en el método viewdidload:

NSString *badgeValue = [NSString stringWithFormat:@"%i", [cacheNotifications count]]; if([cacheNotifications count] != 0){ [[[[[self tabBarController] viewControllers] objectAtIndex: 1] tabBarItem] setBadgeValue:badgeValue]; } 

Sin embargo, tengo un daemon ejecutándose en segundo plano que busca notifications cada 30 segundos. Sería genial si pudiera cambiar la insignia de este demonio.

Cuando llamo algo como esto:

 PlatformViewController *theInstance = [[PlatformViewController alloc] init]; [theInstance updateNotificationsBadge]; 

Llama a la function pero no actualiza la insignia. Con o sin el performSelectorOnMainThread.

updateNotificationsBadge:

 -(void) updateNotificationsBadge{ NSString *badgeValue = [NSString stringWithFormat:@"%i", [cacheNotifications count]]; NSLog(@"Length here is: %i", [cacheNotifications count]); if([cacheNotifications count] > 0){ NSLog(@"call.."); [self performSelectorOnMainThread:@selector(setNotification:) withObject:badgeValue waitUntilDone:YES]; } 

}

 -(void)setNotification:(NSString*)badge{ NSLog(@"Called. %@", badge); [[[[[self tabBarController] viewControllers] objectAtIndex: 1] tabBarItem] setBadgeValue:badge]; 

}

¿Cómo podría arreglar esto?

¡Gracias por adelantado!

EDITAR:

cacheNotifications es una variable global declarada en globalVars.m. No se reinicializa cuando invoco una nueva instancia.

Llamo al siguiente código de daemonClass.m

 PlatformViewController *theInstance = [[PlatformViewController alloc] init]; [theInstance updateNotificationsBadge]; 

En lugar de crear una nueva instancia para platformViewController , debe usar la reference existente . Cuando crea uno nuevo, no se initialized matriz cacheNotification ni contents en ella. Por lo que siempre devolverá 0 .

y UITabBarController es un containerViewController contiene todos los viewControllers . Por lo tanto, no es necesario cambiar la pestaña badgeValue de la otra class. Simplemente puede cambiarlo de cualquier class.

y en su método setNotification: cambie el badgeValue esta manera.

 [[[[self tabBarController] tabBar] items] objectAtIndex:1] setBadgeValue:badge]; 

Debe usar la misma instancia de class y no crear la nueva. Que destruyen el valor anterior. Recomendaría usar NSNotificationCenter para publicar una notificación cuando obtenga una insignia que implementará el método del obturador vacío y el método de establecimiento en la class platformViewController . entonces ninguna instancia sería destruir.

Espero que esto ayude

Realmente no sé exactamente su problema, pero creo que usaría una subclass de nsobject y en cada viewController cambiaría la insignia. Algo similar a esto: https://stackoverflow.com/a/9736559/2000162