我搜索了很多但找不到答案因此决定问你:)。
我有一些带有一些观点的应用程序。登录后,我创建了一个带有3个选项卡的UITabBarController。
现在,我希望根据用户的通知数量更改第二个标签的徽章。
此核心在viewdidload方法中调用时起作用:
NSString *badgeValue = [NSString stringWithFormat:@"%i", [cacheNotifications count]];
if([cacheNotifications count] != 0){
[[[[[self tabBarController] viewControllers] objectAtIndex: 1] tabBarItem] setBadgeValue:badgeValue];
}
但是,我在后台运行一个守护进程,每30秒检查一次通知。如果我能从这个守护进程中更改徽章,那就太好了。
当我打电话给这样的话时:
PlatformViewController *theInstance = [[PlatformViewController alloc] init];
[theInstance updateNotificationsBadge];
它会调用该功能,但不会更新徽章。有或没有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];
}
我该如何解决这个问题?
提前致谢!
修改
cacheNotifications是globalVars.m中声明的全局变量。当我调用一个新实例时,它不会重新初始化。
我从daemonClass.m
调用下面的代码PlatformViewController *theInstance = [[PlatformViewController alloc] init];
[theInstance updateNotificationsBadge];
答案 0 :(得分:1)
您需要使用现有参考,而不是为platformViewController
创建新实例。当您创建新数组时,cacheNotification
数组不会是initialized
,也不会是contents
。所以它总是返回0 。
和UITabBarController
是containerViewController
,其中包含所有viewControllers
。因此,您无需更改其他类中的选项卡badgeValue
。 您只需在任何课程中进行更改即可。
并在您的setNotification:
方法中,像这样更改badgeValue
。
[[[[self tabBarController] tabBar] items] objectAtIndex:1] setBadgeValue:badge];
答案 1 :(得分:0)
您应该使用相同的类实例而不是创建新实例。这破坏了之前的价值。我建议您在获得徽章时使用NSNotificationCenter发布通知,该徽章将在platformViewController
类中实现徽章的void getter和setter方法。那么没有实例会被破坏。
希望这有帮助
答案 2 :(得分:0)
我真的不知道你的问题,但我认为我会使用nsobject的子类,并且在每个viewController中我都会更改徽章。类似于此的内容:https://stackoverflow.com/a/9736559/2000162
答案 3 :(得分:0)
func setBadge(){
let viewconrollers = self.tabBarController?.viewControllers
viewconrollers![3].tabBarItem.badgeValue = "Your String value"
viewconrollers![3].tabBarItem.badgeColor = UIColor.green
}
//call setBadge() method from view controller's viewdidload method.
// select your give number it the view controllers array for providing badge on the desired tab