2014-01-18 57 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。

相關問題