2014-01-18 23 views
5

(iOS的7的Xcode 5.0.2)如何改变的iOS状态栏的颜色在儿童视图控制器

我用以下方法,成功改变状态栏颜色为白色根视图控制器上

[self setNeedsStatusBarAppearanceUpdate]; // Update status bar style 

-(UIStatusBarStyle)preferredStatusBarStyle 
{ 
    return UIStatusBarStyleLightContent; // Set status bar color to white 
} 

现在我想,当导航到子视图控制器状态栏的颜色更改为黑色,我不知道如何做到这一点(状态栏的颜色仍然是白色)

我搜查,并发现这种方法:childViewControllerForStatusBarStyle 我读过苹果的文档,但仍然不知道如何/在哪里使用它,我不确定这是否是正确的方法

任何人都知道如何更改子视图控制器中的状态栏颜色?

+0

您的孩子视图控制器是否在导航控制器内? –

+0

@JamesFrost是的。 – Strong

回答

9

默认情况下,UINavigationController似乎不提供childViewControllerForStatusBarStyle的合理默认实现。通过实现这个方法,你可以告诉你的navigationController把所有调用推迟到preferredStatusBarStyle到最顶层的childViewController。

你既可以子类UINavigationController和实施方法存在,或者只需要添加一个类别:

@implementation UINavigationController (ChildStatusBarStyle) 

- (UIViewController *)childViewControllerForStatusBarStyle 
{ 
    return self.topViewController; 
} 

@end 
+6

我不确定是否为在子类中声明的方法提供类别(UINavigationController继承UIViewController)方法是一个好主意 - 如果我没有弄错,这会导致未定义的行为,因为类别不是合适的重写。因此,我会建议去与子类相反。不过,它是一个很好的答案! (+1) – Till

+0

@JamesFrost真的很好的建议,我现在开始弄清楚如何使用它。让我尝试一下,然后再回到你身边。非常感谢! (+1) – Strong

+0

@Till是啊,子类化是一个好主意:) – Strong

0

我刚刚发现: 当你正确地嵌入里面UINavigationController的根视图控制器,你永远需要创建一个类别来扩展导航控制器的功能,或者为了相同的目的对UINavigationController进行子类化。

你只需要在每个视图控制器中放入preferredStatusBarStyle,并且记得调用[self setNeedsStatusBarAppearanceUpdate];来更新状态栏的样式。就这样简单!

观看此视频,从WWDC 2013:Click Here


编辑:

我做这个工作的原因,是我碰巧设置UINavigationBar的隐患。在这种情况下,根本不使用UINavigationController时表现相同。 当您尝试更改UINavigationController堆栈内的UIViewController的StatusBarStyle时。它将无法以这种方式工作。它只适用于单独的UIViewController。 WWDC 2013视频示例未使用UINavigationController,因此该方法工作正常。

+0

您可以指定“在UINavigationController中正确嵌入根视图控制器”的含义吗?我创建了一个简单的空白项目,并通过故事板嵌入了一个UIViewController。 preferredStatusBarStyle永远不会被调用。 – chourobin

+1

@chourobin你说得对。而我上面的答案是误导性的。我使它工作的原因是,我碰巧设置了隐藏的UINavigationBar。在这种情况下,根本不使用UINavigationController时表现相同。 – Strong

+0

@chourobin当您尝试更改UINavigationController堆栈内的UIViewController的StatusBarStyle时。它将无法以这种方式工作。它只适用于单独的UIViewController。 WWDC 2013视频示例没有使用UINavigationController,因此该方法工作正常。你可能想要另一种方式:) – Strong

0

相比于詹姆斯·弗罗斯特说,花了调试,为什么我的浏览器活动已经错了状态栏的颜色(SWIFT)多少时间后:这就是说

override func childViewControllerForStatusBarStyle() -> UIViewController? { 
    return visibleViewController 
} 

:在某些情况下.topViewController是正确的,在别人像UIActivities它是.visibleViewController。

相关问题