0

我有UISearchBar,並且當我從UISearchBar單擊搜索按鈕時,我想顯示另一個UIViewController。我正在使用以下方法:由pushViewController調用的UIViewController出現的動畫顯示兩次

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" 
                 bundle:nil]; 
    UIViewController *add = 
    [storyboard instantiateViewControllerWithIdentifier:@"mainMenuViewController"]; 

    [self.navigationController pushViewController:add animated:YES]; 
} 

問題是出現動畫的UIViewController被調用兩次。我看到舊的控制器從右到左滑動兩次。

現在,如果我使用相同的代碼來顯示新的控制器,當點擊一些常規的UIButton時,動畫問題就消失了。所以它似乎與UISearchBar有某種關係。

searchBarSearchButtonClicked的委託方法只被調用一次。

重現問題的代碼非常少,可能我會在稍後附上示例項目。

但隨着搜索欄的UIViewController看起來是這樣的:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 100, 20)]; 
    searchBar.placeholder = NSLocalizedString(@"search a pub or a place", nil); 
    searchBar.delegate = self; 
    [self.navigationItem setTitleView:searchBar]; 

} 

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    DLog(@"Filter searchBarSearchButtonClicked"); 
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" 
                 bundle:nil]; 
    UIViewController *add = 
    [storyboard instantiateViewControllerWithIdentifier:@"mainMenuViewController"]; 

    [self.navigationController pushViewController:add animated:YES]; 
} 

問題既是在iOS 8和9

編輯:

我上傳示例項目here。這是非常簡約的。

EDIT2:

如果我提出這樣的控制器,而不是通過導航控制器,只顯示一次動畫。 (這是另一個動畫 - 從下往上,前一個從右到左)。但我需要通過導航控制器來完成。所以這個問題似乎與UISearchBar Search單擊+導航控制器有關。

[self presentViewController:add 
        animated:YES 
       completion:nil]; 

當然,我也可以把它叫做沒有動畫像這樣:

[self.navigationController pushViewController:add animated:NO]; 

但是如果我想要的動畫。

EDIT3:

我試圖通過SEGUE顯示第二控制器,但它並沒有幫助。

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    [self performSegueWithIdentifier:@"seg1" sender:self]; 
} 

Edit4:

我已經報告這個錯誤給蘋果,因爲我想這UIKit中一定是錯誤。無論如何,如果有人會找到解決辦法,這將是件好事。

+0

也許有些東西越來越混亂了UISearchController的解僱。有一件事是嘗試將按鈕委託代碼移動到一個帶有簡單簽名的方法中,然後用'self performSelector'調用它。 – danh

+0

感謝您的想法,我已經嘗試過,但問題仍然存在。 – luky

回答

1

我沒有在文檔中發現任何說搜索欄作爲導航項titleView被禁止,但這是造成不必要的動畫的原因。

將該按鈕添加爲子視圖,並且在推動中將出現單個動畫。快速修復是在繼續演示之前將其刪除...

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    [self.navigationItem.titleView removeFromSuperview]; 

    // and so on with the OP code... 

奇怪的是,這修復了額外的動畫問題,但實際上並沒有刪除搜索欄。刪除後檢查titleView顯示搜索欄仍然存在。

+0

很棒!所以我不知道我是否應該依靠這種黑客解決方案,因爲它看起來也有問題(如果它不刪除視圖) - 但它是有效的,是的。我可以添加哪個按鈕作爲子視圖,並在哪裏? – luky

+0

可能是我可以依靠那個hacky解決方案,就像它在編譯時刻起作用一樣,無論蘋果是否將在未來版本中修復刪除,它都將永久工作。我不確定。取決於UIKit是否與已編譯的應用程序鏈接,或者是動態調用。 – luky

+0

很高興有幫助。我處理這個問題的方式是使用文檔中建議的UISearchController。這裏提出的黑客攻擊是爲了繞過搜索欄的原始黑客作爲標題視圖。 – danh

相關問題