![](https://velog.velcdn.com/images/rudin_/post/d8191b57-6f3d-4eb8-8207-6643da4bc13e/image.png)
코드로 서치바 추가하기
override func viewDidLoad() {
super.viewDidLoad()
let searchBar = UISearchBar()
searchBar.placeholder = "검색"
searchBar.showsCancelButton = true
navigationItem.titleView = searchBar
}
- 해당 vc를 가진 씬은 네비게이션 vc에 임베드 되어있어야 함
titleView에는 뷰를 넣을 수 있다.
let btn = UIButton(type: .custom)
btn.setTitle("취소", for: .normal)
btn.setTitleColor(.systemOrange, for: .normal)
btn.addTarget(self, action: #selector(closeVC), for: .touchUpInside)
btn.widthAnchor.constraint(greaterThanOrEqualToConstant: 40).isActive = true
let stack = UIStackView(arrangedSubviews: [searchBar, btn])
stack.axis = .horizontal
stack.spacing = 8
navigationItem.titleView = stack
- 그러나 이렇게 추가하면 스택뷰의 너비 제약이 없어 서치바가 표시되지 않는다. 따라서 너비 제약을 추가해야 한다.
![](https://velog.velcdn.com/images/rudin_/post/cdaebc37-d4fb-460d-9971-a3a755f4c83b/image.png)
stack.widthAnchor.constraint(greaterThanOrEqualToConstant: view.bounds.width - 40).isActive = true
delegate
- cancel버튼을 동작하게 하려면 delegate를 구현해야 한다.
viewdidload
에서 당연히 델리게이트를 self로 지정하자.
searchBar.delegate = self
![](https://velog.velcdn.com/images/rudin_/post/a3c77c49-6fb3-411e-b4e2-4ae07838cc1e/image.png)
CancelButtonClicked
델리게이트를 구현하면 Cancel 버튼을 누를 시 동작을 구현할 수 있다.
textDidChange
![](https://velog.velcdn.com/images/rudin_/post/04989308-80bd-4921-9deb-6fde62eb3879/image.png)
- 서치바에 입력할때마다(즉, 텍스트가 변경될때마다) 호출된다.
- 검색 기능은 여기서 구현하면 된다.
extension CitySelectionViewController: UISearchBarDelegate{
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
guard !searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else {
filteredList = list
tableView.reloadData()
tableView.isHidden = filteredList.isEmpty
return
}
filteredList.removeAll()
for section in list{
let items = section.items.filter{ $0.title.lowercased().contains(searchText.lowercased()) }
if !items.isEmpty {
filteredList.append(Section(title: section.title, items: items))
}
}
tableView.reloadData()
tableView.isHidden = filteredList.isEmpty
}
}
![](https://velog.velcdn.com/images/rudin_/post/550c428c-44d1-4643-856d-4449cdbcb202/image.png)
- 만약 검색 결과가 존재하지 않을 경우, 검색 결과 없음을 표시하고 싶다면 레이블을 테이블뷰 뒤에 추가하면 된다.
- 검색 결과가 없을 경우 테이블뷰가 표시되지 않도록
tableView.isHidden = filteredList.isEmpty
로 해뒀기 때문에 때문에 별도로 아웃렛을 연결하여 처리할 필요는 없다.
![](https://velog.velcdn.com/images/rudin_/post/a21c47e6-0e24-46b0-8bee-a0bf005224cf/image.png)
![](https://velog.velcdn.com/images/rudin_/post/8e0b3bc9-67f8-4716-a1a0-c1fa42a444e1/image.png)