Search code examples
iosswiftuitableviewuisearchbaruisearchcontroller

How to add SearchController.searchBar under navigationBar (UITableView) swift


I try to add SearchController.searchBar under navigation bar.

override func viewDidLoad() {
        super.viewDidLoad()
        searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self
        searchController.searchBar.sizeToFit()
        searchController.hidesNavigationBarDuringPresentation = false
        searchController.delegate = self
        searchController.dimsBackgroundDuringPresentation = false //
        searchController.searchBar.delegate = self
        let SearchFrame = CGRectMake(0,(self.navigationController?.navigationBar.frame.height)!, (self.navigationController?.navigationBar.frame.width)!,searchController.searchBar.frame.height)
        searchController.searchBar.frame = SearchFrame
        self.navigationController?.navigationBar.addSubview(searchController.searchBar)
}

This code add a searchBar under navigationBar, but searchBar can't detect user interaction! I can't click on search text input field!! What did I do wrong?


Solution

  • My problem was solved!

    First we need to create a XIB file with class and add two navigationBar to them! Then need to add a IBOutlets! Two navigation bar in xib!

    Then write the code:

    var TitleNavigationBar = UINavigationBar() //This need to add Title and Subtitle to NavigationBarTitleView
    
    override func viewDidLoad() {
            super.viewDidLoad()
            let NavBarWithSearch = NSBundle.mainBundle().loadNibNamed("NavBarWithSearchBar", owner: self, options: nil)[0] as! NavBarWithSearchBar
            self.navigationController?.navigationBar.frame = CGRectMake((self.navigationController?.navigationBar.frame.origin.x)!, 0.0, (self.navigationController?.navigationBar.frame.width)!, (self.navigationController?.navigationBar.frame.height)! +          self.searchController.searchBar.frame.height)
            NavBarWithSearch.frame = CGRectMake(0.0,0.0, (self.navigationController?.navigationBar.frame.width)!, (self.navigationController?.navigationBar.frame.height)!)
            NavBarWithSearch.NavigationBarForSearchBar.topItem?.titleView = searchController.searchBar
            TitleNavigationBar = NavBarWithSearch.CustomNavigationBar //=======This need to add Title and Subtitle to NavigationBarTitleView`
            self.navigationController?.navigationBar.addSubview(NavBarWithSearch)
            self.automaticallyAdjustsScrollViewInsets = false
            tableView.contentInset = UIEdgeInsetsMake((self.navigationController?.navigationBar.frame.height)! + UIApplication.sharedApplication().statusBarFrame.height, 0, (self.tabBarController?.tabBar.frame.height)!, 0)
            searchController.hidesNavigationBarDuringPresentation = false
    }
    override func viewWillAppear(animated: Bool) {
    
            //This need to add Title and Subtitle to NavigationBarTitleView
            let titleView = NSBundle.mainBundle().loadNibNamed("NavTitleView", owner: self, options: nil)[0] as! NavTitleView
            titleView.TitleLabel.text = "Title"
            titleView.contentMode = UIViewContentMode.ScaleAspectFit
            titleView.SubtitleLabel.text = "SubTitle"
            let TitleViewFrame = CGRectMake((UIScreen.mainScreen().bounds.width/2) - 80, 0, 160, 44)
            titleView.frame = TitleViewFrame
            TitleNavigationBar.topItem?.titleView = titleView
            //========This need to add Title and Subtitle to NavigationBarTitleView
            self.navigationController?.navigationBar.frame = CGRectMake((self.navigationController?.navigationBar.frame.origin.x)!, 20, (self.navigationController?.navigationBar.frame.width)!, (self.navigationController?.navigationBar.frame.height)! + self.searchController.searchBar.frame.height)
    
    }
    

    XIB file with Class for NavBarTitleView with subtitle should be look like like this: Title and SubTitle

    Finally i get beautiful Navigation Bar with search bar!

    Navbar with search bar text input

    P.S. searchController.hidesNavigationBarDuringPresentation = true // This doesn't work because Custom navigation bar added to main navigation bar as subview!