UINavigationBarにUISearchBarを追加する

はじめに

UINavigationBarのUINavigationItemにUISearchBarを追加して任意の画面を表示させることができます。

ちょっとつまずいたのでメモ

コード

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let searchController = UISearchController(searchResultsController: SearchResultViewController())
        searchController.searchResultsUpdater = self
        //これがないとios13以下の端末で真っ白に表示される
        searchController.modalPresentationStyle = .popover
        navigationItem.searchController = searchController
    }
    
}
extension ViewController: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        let text = searchController.searchBar.text ?? ""
        print(text)
    }
}
class SearchResultViewController: UIViewController {
    
    let arr = ["hoge", "huga", "piyo"]
    
    @IBOutlet weak var tableView: UITableView! {
        didSet {
            tableView.delegate = self
            tableView.dataSource = self
            tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
}

extension SearchResultViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return arr.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = arr[indexPath.row]
        return cell
    }
}

動いてるもの

だいぶ作りが荒く変な間とか開いちゃってますがそこは各自調整してください。

検索結果とかをリアルタイムでアニメーションさせて表示させたりすると良い感じになると思います。