UISearchControllerで検索機能作成 簡単App

#今回の内容
<img width="150" alt="E6CECDAC-385B-4D9D-B3A0-D3CC9A07EB0E_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/d83b3ab1-6dfd-0fc0-cdcb-1ec7e8b1631a.jpeg"> <img width="151" alt="25B43D27-3FC4-4F3C-B5A5-C2556C87CE72_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/f8a9f285-a013-f0a5-d764-f862ab940630.jpeg"> <img width="151" alt="38918CE1-60C3-42FA-A7F6-8596C891A591_1_201_a.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/929623ba-0fb5-3b7c-b03c-bfbdf6fcf408.jpeg">


#コードと簡単解説

* Main.storyboardで`NavigationController`と`tableView`の作成をします。

##navigationItemにUISearchControllerを表示

* `navigationItem.searchController = searchController`でUISearchControllerをnavigationItemに表示することができます。

* `navigationItem.hidesSearchBarWhenScrolling = false`では、スクロール時に`SearchBar`が表示された状態を維持します。
 
```Swift:

           ~~~~~~~~~~省略~~~~~~~~~~

    let searchController = UISearchController()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        navigationItem.searchController = searchController
        navigationItem.hidesSearchBarWhenScrolling = false
        
        title = "全て表示中"
        tableView.delegate = self
        tableView.dataSource = self
        searchController.searchBar.delegate = self
    }
```

## UISearchBarDelegate (検索機能作成)

* `func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {}`内では、`searchBar`に文字が入力された時、削除された時などに`cellContentsArray`の値から`searchText`の値が一文字でも含まれている値だけを`searchResultArray`に入れていきます。

* `func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {}`内では、`CancelButton`が押された時に、`searchResultArray`を空にして、tableViewに`cellContentsArray`の全ての値を表示出来る様にします。

```Swift:
extension ViewController:UISearchBarDelegate{
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        
        searchResultArray = []
        cellContentsArray.forEach { cellContent in
            
            if cellContent.contains(searchText) == true {
                
                searchResultArray.append(cellContent)
                title = "”\(searchText)”で検索中"
                tableView.reloadData()
                
            }else if searchText == ""{
                
                tableView.reloadData()
            }
        }
    }
    
    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
     
        searchResultArray = []
        title = "全て表示中"
        tableView.reloadData()
    }
    
}
```

#全てのコード

```Swift:
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    
    let searchController = UISearchController()
    
    let cellContentsArray = ["UITableView",
                             "UISearchController",
                             "UIView",
                             "UIColor",
                             "UICollectionView",
                             "UISwich",
                             "UIKit",
                             "UITextField",
                             "UIViewController",
                             "UILabel"]
      
    var searchResultArray = [String]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        navigationItem.searchController = searchController
        navigationItem.hidesSearchBarWhenScrolling = false
        
        title = "全て表示中"
        tableView.delegate = self
        tableView.dataSource = self
        searchController.searchBar.delegate = self
    }    
    
}

extension ViewController:UISearchBarDelegate{
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        
        searchResultArray = []
        cellContentsArray.forEach { cellContent in
            
            if cellContent.contains(searchText) == true {
                
                searchResultArray.append(cellContent)
                title = "”\(searchText)”で検索中"
                tableView.reloadData()
                
            }else if searchText == ""{
                
                tableView.reloadData()
            }
        }
    }
    
    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
     
        searchResultArray = []
        title = "全て表示中"
        tableView.reloadData()
    }
    
}

extension ViewController:UITableViewDelegate,UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        
        return tableView.frame.size.height / 7        
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        
        return 1        
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return {() -> Int in
            
            switch searchResultArray.count > 0{
            
            case true: return searchResultArray.count
                
            case false: return cellContentsArray.count
                
            }
        }()
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        
        cell.textLabel?.text = {() -> String in
           
            switch searchResultArray.count > 0{
            
            case true: return searchResultArray[indexPath.row]
                
            case false: return cellContentsArray[indexPath.row]
            }
        }()
        
        return cell
    }
    
}
```

# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。