Ios 无法显示UISearchController
我有以下视图层次结构:Ios 无法显示UISearchController,ios,swift,uinavigationcontroller,uinavigationbar,uisearchbar,Ios,Swift,Uinavigationcontroller,Uinavigationbar,Uisearchbar,我有以下视图层次结构: UINavigationController || \/ LibraryTableViewController: UITableViewController ||
UINavigationController
||
\/
LibraryTableViewController: UITableViewController
||
\/
AlbumsCollectionViewController: UICollectionViewController
||
\/
SongsTableViewController: UITableViewController
我想在相册集合视图控制器中有一个搜索栏,在歌曲稳定控件中有一个不同的搜索栏,显示在导航项中。标题视图
我已设法在相册集合视图控制器中添加了一个可用的搜索栏,如下所示:
class AlbumsCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout, UISearchControllerDelegate, UISearchResultsUpdating, UISearchBarDelegate {
var searchController : UISearchController!
override func viewDidLoad() {
super.viewDidLoad()
initSearchBar()
initNavigationBar()
}
private func initSearchBar() {
self.searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.delegate = self
self.searchController.searchBar.delegate = self
self.searchController.hidesNavigationBarDuringPresentation = false
self.searchController.dimsBackgroundDuringPresentation = false
searchController.searchResultsController?.view.isHidden = false
searchController.hidesNavigationBarDuringPresentation = false
self.extendedLayoutIncludesOpaqueBars = true
self.definesPresentationContext = true
searchController.searchBar.backgroundColor = UIColor.black
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes([NSAttributedStringKey.foregroundColor : UIColor.white], for: .normal)
self.navigationItem.titleView = searchController.searchBar
navigationItem.titleView?.isHidden = true
}
private func initNavigationBar() {
searchButton.tintColor = UIColor.white
settingsButton.tintColor = UIColor.white
backButton.tintColor = UIColor.white
self.navigationItem.title = "Artists"
self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white]
}
@IBAction func SearchButtonTapped(_ sender: Any) {
showSearchBar()
}
private func showSearchBar(){
navigationItem.titleView?.isHidden = false
searchController.isActive = true
}
}
请注意,搜索栏隐藏在ViewDidLoad()
上,并在按下按钮时显示,如searchbuttonattaped
方法所示
现在,我正在尝试在SongsTableViewController
中执行相同的操作,但是,当点击按钮(即调用SearchButtonTapped
)时,搜索栏不显示,我收到以下消息:
Warning: Attempt to present <UISearchController: 0x7f8158812b50> on <MyProject.AlbumsCollectionViewController: 0x7f81588023c0> whose view is not in the window hierarchy!
当您在
SongsTableViewController
上时,您的AlbumsCollectionViewController
不在窗口层次结构中
据我所知,您正在从SongsTableViewController
调用showSearchBar
相册集合视图控制器的方法。由于您从AlbumsCollectionViewController
导航到SongsTableViewController
,因此您的AlbumsCollectionViewController
不在窗口层次结构中,因此无法显示搜索控制器
要修复此问题,请尝试在SongsTableViewController
中添加一个单独的搜索栏控制器,就像您以前在AlbumsCollectionViewController
中所做的那样
或者,您可以创建一个单独的viewcontroller,实现搜索功能,然后从两个控制器中显示它。当我进行测试时,这就起作用了。我相信问题出在
SongsTableViewController
:self.definesPresentationContext=false
。对于推送的视图控制器,这应该是true
。(见文件)
对于SongsTableViewController
(推式视图控制器),添加以下内容:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.definesPresentationContext = true
}
并将其添加到相册集合视图控制器(初始视图控制器):
对不起,如果我不清楚的话。我在
SongsTableViewController
中有一个单独的UISearchController
。我的意思是,我在两个控制器中使用相同的逻辑。但您的错误表明,您正试图从当前不在视图层次结构中的控制器中显示搜索控制器。您能给出SongsTableViewController的代码吗?如何在视图控制器中显示搜索。如何尝试打开songsController?意思是说,您正在演示或推动哪个控制器?工作。谢谢:)
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.definesPresentationContext = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.definesPresentationContext = false
}