3

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

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

更新通知徽章:

-(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

4 回答 4

1

platformViewController您需要使用现有的引用,而不是为其创建新实例。当您创建一个新数组时,cacheNotification数组不会出现initialized,也不会出现contents在其中。所以它总是返回 0

并且UITabBarController是一个containerViewController包含所有viewControllers. 因此,您无需更改badgeValue其他类的选项卡。您可以简单地从任何类更改它。

并在你的setNotification:方法中,改变badgeValue这样的。

[[[[self tabBarController] tabBar] items] objectAtIndex:1] setBadgeValue:badge];
于 2013-05-13T10:38:19.707 回答
0

您应该使用相同的类实例,而不是创建新实例。这破坏了以前的价值。我建议您在获得徽章时使用 NSNotificationCenter 发布通知,这将在platformViewController课堂上实现徽章的 void getter 和 setter 方法。那么没有实例会被破坏。

希望这可以帮助

于 2013-05-13T10:47:18.430 回答
0

我真的不知道你的问题,但我认为我会使用 nsobject 的子类,并且在每个 viewController 中我会更改徽章。与此类似的东西:https ://stackoverflow.com/a/9736559/2000162

于 2013-05-13T13:51:02.977 回答
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
于 2019-04-04T11:00:45.073 回答