0

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

此代码段在选项卡的视图控制器加载/重新加载/更新/等时运行...

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

这样做的正确方法是:使用自定义类覆盖导航控制器并将徽章值放在该级别?看来我应该把这些信息放在那里,但我还没有找到明确的答案。

4

1 回答 1

1

当 TabBarController 被加载时,它所包含的所有初始视图控制器都被初始化。但是在您导航到相应的选项卡项之前,不会加载他们的视图。因此,此时您无法在任何视图加载方法(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可能未初始化。如果此数据来自 userdefaults,您应该能够在此处阅读这些数据并相应地设置您的徽章。

于 2013-03-27T21:10:49.007 回答