2015-12-02 51 views
1

嘗試了一切。試圖隱藏一個視圖控制器。UIStatusBar不會消失。悲傷和挫折隨之而來

的.plist:

Status bar is initially hidden = NO 
View controller-based status bar appearance = YES 

視圖控制器:

- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 

//I shouldn't have to do this, the above method should suffice. Doesn't work anyway 
- (void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 
    [[UIApplication sharedApplication] setStatusBarHidden:YES]; 

} 

沒有什麼工作。狀態欄仍然存在,將我凝視在臉上,嘲笑它的醜陋。我需要做什麼???

編輯:prefersStatusBarHidden甚至沒有被調用。這個視圖控制器通過push segue被推到導航棧上。這裏

+0

不應該'最初隱藏狀態欄'被設置爲YES? 編輯:忘了看第二句。我的錯。 –

+0

你有沒有嘗試這些建議:http://stackoverflow.com/questions/23615647/uiviewcontrollers-prefersstatusbarhidden-not-working? – TheEye

+0

不是。我沒有模態表達。我只是推動導航堆棧。 – soleil

回答

0

關鍵的是,這是從來沒有得到所謂的視圖控制器:

- (BOOL)prefersStatusBarHidden { 
    return YES; 
} 

向後跟蹤,它不是父導航控制器或者叫做。這是因爲導航控制器屬於根視圖控制器。根視圖控制器確實調用了這個方法,但是並沒有將它傳遞給導航控制器,因此也沒有傳遞給任何其他的子視圖控制器。因此,對於任何有相同問題並嘗試調試的人,請嘗試在層次結構的「根」處跟蹤視圖控制器。

所以在我的情況下,我發佈了任何視圖控制器(viewWillAppear)的通知,我想隱藏狀態欄。該通知隨後被根控制器消耗:

- (void)hideStatusBar:(NSNotification *)notification { 
    self.hideStatusBar = YES; 
    [self setNeedsStatusBarAppearanceUpdate]; 
} 

這迫使該方法是根控制器上稱爲:

- (BOOL)prefersStatusBarHidden { 
    return self.hideStatusBar; 
} 

而且一切正常。重新顯示狀態欄也可以做同樣的事情。

+1

您應該在您的根視圖控制器中實際實現'childViewControllerForStatusBarHidden',並指向導航視圖控制器(或適當的其他子視圖控制器)。這樣,系統將直接跟隨視圖控制器層次結構。如果子視圖控制器更改,請調用'setNeedsStatusBarAppearanceUpdate'來讓系統知道。 – jcaron

1

在任何包含視圖控制器的自定義中,實現childViewControllerForStatusBarHidden,返回應該控制器狀態欄外觀的當前子視圖控制器(在本例中爲導航控制器)。

這將讓系統跟隨視圖控制器層次結構向下到當前的「頂部」視圖控制器,它將被查詢的視圖控制器的prefersStatusBarHidden

在包含您的自定義視圖控制器中,如果當前「活動」子視圖控制器發生更改,請致電setNeedsStatusBarAppearanceUpdate讓系統知道。