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

Posted

技术标签:

【中文标题】在未实例化的视图控制器上设置徽章值的正确方法?【英文标题】:proper way to set badge value on uninstantiated view controller? 【发布时间】:2013-03-27 18:14:47 【问题描述】:

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

这个 sn-p 在标签的视图控制器加载/重新加载/更新/等时运行...

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

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

【问题讨论】:

您的第二个 View 控制器从哪里获取数据? self.photos 是什么?有什么方法可以从您的第一个视图控制器中获取相同的数据? 这两个视图控制器真的不应该看到彼此的数据。它们是不同的、独立的应用程序。 self.photos 信息最终来自用户的默认列表,但我似乎一直认为让第一个视图控制器获取它不应该真正知道的数据是“不好的”。 这不是严格相关的,但是...您使用的是故事板、xib 还是只是代码? 并且......只是为了清楚......你有一个 UITabBarController,有两个项目,每个项目的初始 UIViewController 都嵌入在单独的 UINavigationController 中? 是的,它在故事板中,就像你说的那样。 UITabBarController 转到 2 个不同的 UINavigationCollers,每个 UINavigationCollers 都嵌入了视图控制器。 【参考方案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,您应该能够在此处阅读这些数据并相应地设置您的徽章。

【讨论】:

是的 - 这是有效的。在执行我的任何代码之前是否需要调用 [super awakeFromNib]? @kejoki - 是的,我添加了一个 [super awakeFromNib].. 以防 super 正在使用它。

以上是关于在未实例化的视图控制器上设置徽章值的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

在推送的 UITabBarController 上设置徽章

必须使用延迟实例化的UI视图将子视图添加到视图控制器两次

Sencha Touch :: KitchenSink :: 控制器是如何实例化的?

使用angularjs,ngInit加载视图时初始化范围值的正确方法?

以编程方式设置为根视图控制器时,视图控制器无法正确显示子视图

Laravel 4 控制器模板/刀片 - 正确的方法? [关闭]