UISearchControllerを備えたアプリがあります。 UIのこの要素は、次のようなコードで完全に設定されています。
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
searchController.dimsBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = false
searchController.searchBar.searchBarStyle = UISearchBarStyle.Minimal
searchController.searchBar.frame = CGRectMake(searchController.searchBar.frame.Origin.x, searchController.searchBar.frame.Origin.y, searchController.searchBar.frame.size.width, 44.0)
次に、それをtableViewのtableHeaderViewに追加します。
tableView.tableHeaderView = searchController.searchBar
すべてが正常に動作しているように見えますが、それがアクティブで、tableViewで項目を選択すると、アプリは別のビューコントローラーにセグメンテーションし、検索コントローラーはビューに保持されます。検索コントローラーは別のビューコントローラーのテーブルビューのサブビューである必要があるため、これがどのように可能かについてはわかりません。これを防ぐにはどうすればよいですか?
prepareForSegue
でactiveプロパティをfalseに設定することにより、searchControllerを手動で非表示にできます。以下のコードをprepareForSegue()
に追加します
_searchController.active = false
_
または、viewDidLoad()
に次の行を追加して、デフォルトの動作を取得する必要があります
_definesPresentationContext = true
_
definesPresentationContext のドキュメントから
ビューコントローラーまたはその子孫の1つがビューコントローラーを提示するときに、このビューコントローラーのビューがカバーされるかどうかを示すブール値。
討論
ビューコントローラーが提示されると、iOSは提示するビューコントローラーから開始し、プレゼンテーションコンテキストを提供するかどうかを尋ねます。提示するビューコントローラーがコンテキストを提供しない場合、iOSは提示するビューコントローラーの親ビューコントローラーに問い合わせます。 iOSは、ビューコントローラーがプレゼンテーションコンテキストを提供するまで、ビューコントローラー階層を検索します。コンテキストを提供するビューコントローラーがない場合、ウィンドウのルートビューコントローラーがプレゼンテーションコンテキストを提供します。
ビューコントローラがtrueを返す場合、プレゼンテーションコンテキストを提供します。ビューコントローラーのビューで覆われたウィンドウの部分は、表示されるビューコントローラーのビューのサイズを決定します。このプロパティのデフォルト値はfalseです。
重要な注意(コメントの@paulvsから)
少し落とし穴。検索コントローラーではなく、ビューコントローラーでdefinePresentationContextを設定します。これは強調する価値があると思います。
独自の遷移を管理し、popToViewControllerを使用してビューを離れる場合は、ビューではなくsearchControllerにコンテキストを提供します。
searchController.definesPresentationContext = true
エラーが発生します
popToViewController:transition: called on <UINavigationController 0x7f984204f800> while an existing transition or presentation is occurring; the navigation stack will not be updated