iOS - 从其他类更改标签栏徽章

时间:2013-05-13 10:33:44

标签: ios xcode tabbar badge

我搜索了很多但找不到答案因此决定问你:)。

我有一些带有一些观点的应用程序。登录后,我创建了一个带有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];

4 个答案:

答案 0 :(得分:1)

您需要使用现有参考,而不是为platformViewController创建新实例。当您创建新数组时,cacheNotification数组不会是initialized,也不会是contents。所以它总是返回0

UITabBarControllercontainerViewController,其中包含所有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