BOID
[iOS] UISearchController에 대해 - HoonIOS 본문
안녕하세요, HoonIOS입니다.
앱 개발 스터디를 통해서 팀원들과 part별로 나누어서 앱 개발을 하고 있는데 여러 UI 기능을 구현을 하다.
SearchBar을 처음 구현을 해봤는데 이것을 정리하면 좋을꺼 같아 글을 적게 되었습니다.
iOS에서 SearchBar을 구현하는 방법은 2가지가 있습니다.
- UISearchBar
- UISearchController
UISearchBar
애플 문서에서는 사용자로부터 검색 연관된 정보를 받기 위한 특별한 뷰라고 설명이 되어있습니다.
UISearchBar는 entering text, 검색 버튼, 북마크 버튼, 취소 버튼을 제공합니다.
이 UISearchBar을 그냥 구현을 하면 쌩 날것 그대로는 검색기능을 수행하지 않습니다. 즉, UISearchBarDelegate 프로토콜을 사용해서 유저가 텍스트를 쓰고 엔터를 치거나 버튼을 클릭했을 때 동작을 하게 구현해줍니다.
또 다른 특징으로 SearchBar의 모양을 한번에 한 번씩 커스텀을 해서 커스텀해주거나 appearance프록시를 사용해서 앱에 있는 모든 서치바의 외형을 일괄적으로 커스텀할수 있습니다.
마찬가지로 프로퍼티가 bar metrics에 프로퍼티가 의존적일때 개발자는 UIBarMetricsDefault값을 사용할 수 있습니다.
(음.... 공식문서에서 나온부분인데 찾아봐도 무슨 내용인지 모르겠네요..ㅠㅠ 혹시 아시는 분 있으면 댓글 남겨주시면 감사하겠습니다. )
UISearchController
애플 문서에서는 검색창과 상호작용하는것을 베이스로 검색 결과를 보여주는 것을 관리하는 뷰 컨트롤러라고 설명이 되어 있습니다.
이 SearchBar는 iOS8이후로 새로 등장한 UISearchController입니다.
UISearchBar와 함께 사용자와 상호작용을 할때 searchController는 검색 결과 컨트롤러를 통해 검색 결과를 표시합니다.
UISearchController클래스의 initalize을 보시면 init(searchResultsController:)가 있습니다.
공식문서에서 한번 살펴 볼까요?
search Result를 두 번째 뷰 컨트롤러를 통해 검색 결과를 보여주려고 할 때 init(searchResultsController:)에 해주면 됩니다.
이렇게 해주면 사용자가 searchBar와 함께 상호작용을 할 때 searchController는 자동적으로 결과 컨트롤러를 통해 결괏값을 보여줍니다.
이번 구현에서는 UISearchController를 통해서 SearchBar를 구현했는데요, 한번 구현 방법에 대해 살펴보겠습니다.
UISearchController 구현하기
우선 저는 programmically형식을 기반으로 코드를 구현하려고 합니다. :)
결과를 먼저 살펴보면 우선 아래와 같은 SearchBar을 구현을 하겠습니다.
searchBar을 구현하고 검색을 하면 해당 인덱스 값들이 일괄적으로 나오게 하겠습니다.
1. 제일 먼저 스토리보드에 사용할 뷰 컨트롤러를 추가해주고 내비게이션 컨트롤러를 emeded in 해주겠습니다.
2. VC를 만들어줘서 해당 뷰 컨트롤러와 연결해주겠습니다.
* 설명
- 저는 여기서 searchBarViewController로 커스텀 뷰 컨트롤러를 만들어주겠습니다.
tableView를 먼저 만들어주고 searchBar을 만들어주겠습니다.
3. 사용할 테이블 뷰를 프로퍼티로 선언해 주겠습니다.
* 설명
- tableView의 테이블 뷰 관련 변수를 클래스 내에서 어디서든 접근을 할 수 있게 클래스의 지역변수로 지정해주겠습니다.
4. maketableView()이라는 함수를 정의해주겠습니다.
5. UItableView를 설정해주고 추가를 해주겠습니다.
* 설명
- 클래스의 지역변수로 지정해주었던 talbeView에 UITableView() 객체를 넣어 줍니다.
- 우선 여기서는 보여주기만 하면 되기 때문에 delegate 말고 dataSource만 지정을 해주겠습니다.
- .register(UITableViewCell.self, forCellReuseIdentifier: "mountinCell")은 programmically로 UITableView의 셀을 지정해주는 방식으로 Cell을 커스텀하지 않았으므로 UITableViewCell.self의 매개변수값을 지정해 주었고 forCellReuseIdentifier를 통해 테이블 뷰 셀의 identifier을 mointinCell로 지정을 해준 것입니다.
6. UITableView의 레이아웃을 설정해주겠습니다.
* 설명
- 제일 첫 번째 코드에서. translatesAutoresizingMaskIntoConstraints은 기본적으로 설정되어 있는 레이아웃을 사용할 것인지 아닌지 설정하는 것입니다.
레이아웃을 수동으로 설정을 해줄 거면 false로 지정을 해줘야 합니다. - NSLayoutConstraint의 매개변수를 한번 살펴보면 item은 뷰의 왼쪽 제약 조건, attribute는 왼쪽 뷰의 제약조건 방향, relatedBy는 왼쪽 사이드와 오른쪽 사이드의 제약조건 형태의 관계를 나타나는 것으로 NSLayoutConstraint.Relation 의 열거형 값, toItem: 뷰의 오른쪽 제약 조건 attribute는 오른쪽 뷰의 제약조건 방향, multiplier는 attribute 첫 번째 값과 attrubute 두 번째값에서 얻은값과 해당값을 곱하도록 하는 값입니다. constant는 attrubute 첫번째 값이 attribute 두번째 값에 추가하는 값을 나타냅니다.
이렇게 위아래 오른쪽 왼쪽을 다 설정해 줬습니다.
7. makeSearchBar()이라는 함수를 정의해주겠습니다.
8. 이 함수 내에 UISearchController을 정의해주겠습니다.
* 설명
- UISearchController객체를 만들어주고 간단하게. placholder을 설정해 줍니다.
- . obscureBackgroundDuringPresentation은 서치 바로 최초 응답자가 가게 되면은 나머지 뷰들을 어둡게 하거나 그렇지 않게 하거나 설정을 해주는 것인데 true면 어두워지고 false면 밝아집니다. 한번 비교해보겠습니다.
- . searchResultUpdater는 UISearchResultsUpdating프로토콜의 델리게이트 패턴을 설정해 준 것입니다. 해당 이벤트는 나의 객체에게 알려줘라는 말이죠 ㅎㅎ
9. navigationItem의 속성을 설정하고 설정한 searchController을 넣어주겠습니다.
* 설명
- navigationItem의. hideSearchBarWhenScrolling property는 스크롤을 할 때 searchBar부분을 계속 유지 시킬건지 hide를 할지 정해주는 것입니다.
true값을 넣어주면 스크롤을 할 때 searchBar을 숨겨주고 false값을 넣어주면 스크롤을 해도 보이게 됩니다. - 이 포스팅의 핵심은 이 부분입니다. UISearchController는 navigationItem의 searchController에 넣어줘야 하는 것입니다.
따라서 아까 설정해준 searchController객체를 여기다가 넣어줬습니다. - self.navigationController?.navigationBar.prefersLargeTitles는 navigationItem.title의 부분을 큰 글자로 넣어준 것입니다. 아래 그림을 보면. prefersLargeTitles 부분을 true로 넣어준 것입니다.
이제 큰 틀은 다 만들었습니다. 이제 검색을 할 때마다 해당하는 값이 나오게 구현을 해주겠습니다.
10. UISearchResultsUpdating을 구현해주고 updateSearchResults 함수를 구현해주겠습니다.
* 설명
- 이 메서드는 서치바에서 검색을 할때마다 메서드가 실행되게 됩니다.
11. 해당 메서드 안을 구현해주겠습니다. 텍스트를 입력할 때마다 해당하는 text를 가져오겠습니다.
* 설명
- data는 데이터 모델이고 items는 해당 배열 안에 들어갈 값들을 나타낸 배열입니다.
- . localizedCaseInsensitiveContains(text)를 통해 searchBar에 있는 text를 한 단어별로 값을 읽어오게 됩니다.
여기서 filterValue배열은 단어로 filter 한 결과를 나타냅니다.
12. 이제 tableView의 DataSource의 메서드를 구현해주겠습니다.
* 설명
- 여기서 isFiltering변수는 Bool형 변수로 새로 정의한 값입니다.
- searchController가 active 중이고 text가 비어있지 않으면 true를 반환하고 그렇지 않으면 false를 반환합니다.
- 이제 해당 메서드의. isFiltering을 보겠습니다. 만약 text가 편집이 되면 filterValue를 반환하고 그렇지 않으면 전체 값을 나타내야 하기 때문에 items.count를 반환하게 만들어 줘야 합니다.
13. tableView의 cellforRowAt을 구현하겠습니다.
* 설명
- 여기서는. isFiltering만 보겠습니다.
앞에서 설명한 것처럼. isFiltering을 통해 만약 편집 중이라면 filterValue를 구현해주고 그렇지 않으면 전체 값이 나올 수 있게. items배열을 return 해주면 됩니다.
이렇게 UISearchController에 대해 알아봤습니다. 저도 이번 구현을 통해 처음 접해 본거라 공부한 부분을 포스팅해봤습니다.
추후 추가되는 내용이 있으면 추가 포스팅하겠습니다.
'IOS 시작기' 카테고리의 다른 글
[iOS] sqlite3 간단 구현해서 뽀시기~! - HoonIOS (0) | 2021.06.04 |
---|---|
[iOS]DBMS에서 SQLite3란 - HoonIOS (0) | 2021.06.04 |
[iOS] UIPickerView구현하기 & ToolBar추가 - HoonIOS (0) | 2021.05.30 |
[iOS] 피커뷰 뽀개기 - HoonIOS (0) | 2021.05.29 |
[iOS] 프로퍼티 리스트에 대해 뽀시자 - HoonIOS (0) | 2021.05.27 |