在未实例化的视图控制器上设置徽章值的正确方法?

时间:2013-03-27 18:14:48

标签: ios uinavigationcontroller uitabbarcontroller uitabbaritem

我在标签栏控制器中有2个视图控制器。我的第二个导航控制器想要设置徽章值。 应用程序启动时未加载此控制器,因此徽章不会显示。如果我转到该标签,徽章会正确更新。

此选项卡的视图控制器加载/重新加载/更新/等等...

时会运行此代码段

[self.navigationController.tabBarItem setBadgeValue:[NSString stringWithFormat:@“%u”,[self.photos count]]];

执行此操作的正确方法是:使用自定义类覆盖Nav Controller并将徽章值放在该级别?似乎这就是我应该提供这些信息的地方,但我还没有找到明确的答案。

1 个答案:

答案 0 :(得分:1)

当加载TabBarController时,所有包含初始viewcontrollers的都被初始化。但是,在您导航到相应的标签项之前,不会加载他们的视图。因此,您无法在任何视图加载方法(viewDidLoad等)中执行此处的代码。但是,您可以通过覆盖其中一个初始化方法来执行代码。

如果使用故事板,取消归档viewController的过程会在NIB加载时触发此方法:

- (void) awakeFromNib
{

}

如果不使用Storyboard,则在加载NIB之前调用此初始化程序:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

在任何一种情况下,你都可以覆盖这些方法来执行一些代码......

- (void) awakeFromNib
    [super awakeFromNib];
    [self.navigationController.tabBarItem 
           setBadgeValue:[NSString stringWithFormat:@"badgeValue"]]];
}


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        [self.navigationController.tabBarItem 
           setBadgeValue:[NSString stringWithFormat:@"badgeValue"]]];
    }
    return self;
}

但是,您需要注意从哪里获取数据。此时self.photos可能未被初始化。如果此数据来自用户默认,您应该能够阅读此处的数据并相应地设置徽章。