개발을 시작하는 이야기

07.SearchController, SegmentControl 설정 본문

개발 이야기/우리동네 문화유산 :: JHeritage

07.SearchController, SegmentControl 설정

Teiresias 2022. 3. 11. 18:56

SearchController 

func setSearchBar() {
    searchController = UISearchController(searchResultsController: nil)
    searchController.searchBar.placeholder = "숭례문"
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.searchResultsUpdater = self

    self.navigationItem.searchController = searchController
    self.navigationItem.hidesSearchBarWhenScrolling = false
}

나는 위의 방식으로 ViewController에서 설정했다. 위에서 몇가지 생소한 기능을 기록으로 남겨둔다.

 

hidesNavigationBarDuringPresentation : 자동완성 기능

searchResultsUpdater : 검색 결과를 업데이트할 때 이용할 뷰 컨트롤러

 

navigationItem.searchController : 네비게이션바에 검색바 넣기

 navigationItem.hidesSearchBarWhenScrolling : 화면이 스크롤 되는경우 검색바 보이고 감추기 (기본값은 true)

extension SearchViewController: UISearchResultsUpdating{
    func updateSearchResults(for searchController: UISearchController) {
        let predicate = NSPredicate(format: "ccbaMnm1 CONTAINS[c] %@ OR ccbaMnm2 CONTAINS[c]  %@",searchController.searchBar.text!, searchController.searchBar.text!)
        searchHeritage = localRealm.objects(Heritage_List.self).filter(predicate)
    }
}

ViewController가 검색창에 응답받도록 하기 위해서는 UISearchResultsUpdating을 구현해야 하는데,

이 프로토콜은 사용자가 검색창에 입력한 정보를 기반으로 검색 결과를 업데이트 하는 방법을 정의한다.

 

updateSearchResults에서는 검색창에 입력한 text를 바탕으로, Realm에서 해당 text를 찾게 된다.

SegmentControl

let segmentControl: UISegmentedControl = {
    let array: [String] = ["방문함", "즐겨찾기"]
    let control = UISegmentedControl(items: array)
    control.selectedSegmentTintColor = .customRed
    control.backgroundColor = .clear

    return control
}()

View 페이지에서 설정하며, 특징은 버튼의 갯수를 items:array로 하여 설정함

TintColor 는 활성화된 영역의 색상을, BackgroundColor의 경우 비활성화된 영역의 색상을 지정한다.

@objc func segmentControlClicked(_ target: UISegmentedControl){
    switch target.selectedSegmentIndex {
    case 0:
        tasks = localRealm.objects(Heritage_List.self).filter("visited=true")
        mainView.tableView.reloadData()
    default:
        tasks = localRealm.objects(Heritage_List.self).filter("wantvisit=true")
        mainView.tableView.reloadData()
    }
}

 ViewController에서 설정한 값으로, switch문으로 Index값을 가져와서 각각의 영역이 활성화 되었을때의 이벤트를 설정해주었습니다.