2013-08-30 251 views
2

我看到一個奇怪的情況。我在導航欄中放置了一個搜索欄,並將UISearchDisplayController與搜索欄關聯起來。現在,當用戶點擊搜索欄時,搜索顯示控制器傾向於隱藏導航欄(因此也隱藏搜索欄)。爲了反駁說,我子類UISearchDisplayController並實施了下面的代碼: -UISearchDisplayController隱藏導航欄

- (void)setActive:(BOOL)visible animated:(BOOL)animated 
{ 
    [super setActive: visible animated: animated]; 
    [self.searchContentsController.navigationController setNavigationBarHidden: NO animated: NO]; 
} 

現在,這種解決原有問題。我能夠搜索並導航到其他控制器。

但是,可以說我對視圖控制器A進行搜索,然後單擊搜索結果,然後將視圖控制器B推到導航堆棧上。現在,如果我彈出視圖控制器B並返回到A,則我的導航欄消失。它看起來像搜索顯示控制器是活動的,所以它隱藏了導航欄。

如果我使搜索顯示控制器處於非活動狀態,然後按下視圖控制器B然後彈出它,則會出現導航欄。

那麼,有沒有什麼辦法可以讓我的搜索顯示控制器保持活動狀態,並且當我從導航堆棧中彈出視圖控制器B時,導航欄不會消失?

而且我針對iOS6的

(這是一個很長的代碼,所以不知道我應該在這裏張貼的內容)。

回答

11

好的,以防萬一,如果有人面臨這種​​情況。我爲上述情況實施了一項工作。

問題是,當我從導航堆棧中彈出視圖控制器B時,searchDisplayController在視圖控制器A中仍處於活動狀態。現在,searchDisplayController假定搜索欄應始終位於導航欄(AFAIK)下方。因此,當再次顯示視圖控制器A時,它沒有顯示導航欄。爲了解決這個問題,我寫下面的代碼在視圖控制器A的viewWillLayoutSubviews功能

-(void)viewWillLayoutSubviews 
{ 
    if(self.searchDisplayController.isActive) 
    { 
     [UIView animateWithDuration:0.001 delay:0.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 
      [self.navigationController setNavigationBarHidden:NO animated:NO]; 
     }completion:nil]; 
    } 
    [super viewWillLayoutSubviews]; 
} 

上面提供了一個動畫,使得當用戶查看彈出控制器B,視圖控制器A示出了它的搜索欄激活(如果用戶以前試圖在查看控制器B之前搜索任何內容)。它不是一個非常平穩的過渡,但它的工作:) :)

注意: - 請不要在viewDidLoadviewDidAppear函數使用上述代碼,因爲它可能會提供不需要的動畫。

6
-(void)viewDidLayoutSubviews{ 
    [self.navigationController setNavigationBarHidden:NO animated:NO]; 
} 

它不會隱藏導航欄。

+1

工作就像一個魅力,應該被接受的答案。 – Matt

3

如果有人遇到這個問題.. 這裏是我的解決方案。

-(void) viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    // check if searchDisplayController still active.. 
    if ([searchDisplayController isActive]) { 
    [searchDisplayController setActive:NO]; 
    } 
} 
+2

謝謝!您的回答對我來說效果最佳,因爲我使用了過濾搜索,而其他解決方案在完成鍵入之前刪除了搜索。完成完成後,您的所有人都將刪除搜索。 –