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
}