web-dev-qa-db-ja.com

セグエの後も持続するUISearchController

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で項目を選択すると、アプリは別のビューコントローラーにセグメンテーションし、検索コントローラーはビューに保持されます。検索コントローラーは別のビューコントローラーのテーブルビューのサブビューである必要があるため、これがどのように可能かについてはわかりません。これを防ぐにはどうすればよいですか?

screenshot

30
Kilian

prepareForSegueでactiveプロパティをfalseに設定することにより、searchControllerを手動で非表示にできます。以下のコードをprepareForSegue()に追加します

_searchController.active = false
_

または、viewDidLoad()に次の行を追加して、デフォルトの動作を取得する必要があります

_definesPresentationContext = true
_

definesPresentationContext のドキュメントから

ビューコントローラーまたはその子孫の1つがビューコントローラーを提示するときに、このビューコントローラーのビューがカバーされるかどうかを示すブール値。

討論

ビューコントローラーが提示されると、iOSは提示するビューコントローラーから開始し、プレゼンテーションコンテキストを提供するかどうかを尋ねます。提示するビューコントローラーがコンテキストを提供しない場合、iOSは提示するビューコントローラーの親ビューコントローラーに問い合わせます。 iOSは、ビューコントローラーがプレゼンテーションコンテキストを提供するまで、ビューコントローラー階層を検索します。コンテキストを提供するビューコントローラーがない場合、ウィンドウのルートビューコントローラーがプレゼンテーションコンテキストを提供します。

ビューコントローラがtrueを返す場合、プレゼンテーションコンテキストを提供します。ビューコントローラーのビューで覆われたウィンドウの部分は、表示されるビューコントローラーのビューのサイズを決定します。このプロパティのデフォルト値はfalseです。

重要な注意(コメントの@paulvsから)

少し落とし穴。検索コントローラーではなく、ビューコントローラーでdefinePresentationContextを設定します。これは強調する価値があると思います。

55

独自の遷移を管理し、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
4
Mat