わかりました、これは数時間私を悩ませましたが、ついに動作するようになりました! 問題は、UISearchDisplayController がナビゲーション バーを非表示にしたかどうかを追跡し、非表示にした場合は、ビューが閉じられた後に復元することです。そのため、上記の回答の多くでは、新しいビューが押されたときにバーのアニメーションの末尾が非表示になっていることがわかります。ただし、検索表示コントローラーをだますことで、この動作を変更できます。
最初: UISearchDisplayController のサブクラス化
hereにあるナビゲーションコントローラーが非表示にならないようにする方法に関する回答に従って、ナビゲーションバーを非表示に保つようにコードを変更しました。
- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
if(self.active == visible)
return;
[self.searchContentsController.navigationController setNavigationBarHidden:YES animated:YES];
[super setActive:visible animated:animated];
if (visible)
[self.searchBar becomeFirstResponder];
else{
[self.searchBar resignFirstResponder];
[self.searchContentsController.navigationController setNavigationBarHidden:NO animated:YES];
}
}
スーパー setActive 関数を呼び出す前に、ナビゲーション バーを非表示にしていることに注意してください。これにより、スーパー クラスがナビゲーション バーを非表示にしようとし、その結果、アイテムの選択後に元に戻そうとすることがないように思われます。コントローラーがアクティブになると、バーは通常どおり非表示になります。また、searchBar がファーストレスポンダを辞任すると、ナビゲーション バーが復元されることにも注意してください。コントローラーからキャンセルすると、バーが復元されます。
2 番目: 終了時にナビゲーション バーを非表示にする
ビューのナビゲーション バーを非表示にすると、非表示になります。
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self.navigationController setNavigationBarHidden:YES animated:animated];
}
3: 戻るときにナビゲーション バーを非表示にする
唯一の問題は、フィルタリングされたテーブルビューから行を選択すると、戻ったときにナビゲーション バーが表示されることです。これを修正するには、ビューにチェックを入れる必要があります。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if(self.isFiltered){
[self.navigationController setNavigationBarHidden:YES animated:NO];
}
}
これは巨大なハックのように感じますが、うまく機能し、これ以上の方法はありません。