티스토리 뷰
안녕하세요. 밀쿄입니다.
오늘은 UISearchController에 대해서 알아보겠습니다.
SwfitUI 더 나가기 전에 UIKit에 있는 컨트롤러란 컨트롤러는 다 만져보고 있는 것 같네요.
같이 볼 애플 문서는 여기
https://developer.apple.com/documentation/uikit/uisearchcontroller
설명한 필요한 소스는 여기
https://github.com/dp221125/Swift_UISearchBar_Example
참고로 소스는 브런치를 before로 받으셔야 같이 만들어 볼 수 있습니다.
master는 완성본입니다.
자 그럼 애플 문서부터 봅시다.
Search Bar와의 상호 작용을 기반으로 검색 결과의 표시를 관리하는 View Controller
정도로 해석하면 되겠네요.
쉽게 말하면 SearchBar와 상호작용해서 뷰 컨트롤러에 표시를 담당하는 Controller라는 거네요.
자 오늘은 OverView까지 볼 거예요.
1. 기존 ViewController와 함께 사용
. 2. 검색 가능한 내용이 있는 View Controller가 있으면
UISearchController의 search bar를 ViewController의 인터페이스에 통합
3. 사용자가 search bar와 상호 작용할 때 search controller는
검색 결과와 함께 자동으로 새로운 ViewController에 표시
흠.. 감이 안 오니 더 읽어 봅시다.
1. search controller는 두 가지 Custom View Controller와 함께 작동
-> 첫 번째 View Controller: 검색 가능한 내용을 표시, 메인 인터페이스 일부, 앱에 적합한 방식으로 표시
-> 두 번째: 검색 결과를 표시
2. 초기화할 때 init (searchResultsController :) 사용
-> 두 번째 Controller 전달
오! 초기화 방법이랑 두 개의 뷰 컨트롤러가 필요하다는 걸 알 수 있네요.
그렇지만 저의 상상으로는
기존 뷰
-> 전체 데이터가 담긴 배열이라 필터 담긴 데이터가 별도로 있을 테니까
-> 셀을 만들 때 분기를 타면 안 되나?
->검색을 하고 기존 뷰를 리로드 하면 안 되나?
란 생각이 들었습니다.
고로 전 하나로 해보겠습니다.
안되면 돌아가면 되죠 머..
1. search controller는 ViewController에 추가해야 하는 UISearchBar 제공
2. UISearchBar는 검색 가능한 콘텐츠가 포함된 뷰에 추가
3. 검색어를 입력하기 위해 search bar를 탭 하면 search controller는
자동으로 검색 결과를 search resluts view controller에 나나태고 search process가 시작되었음을 앱에 알림.
여기서는 UISearhch Controller 가 UISearchBar를 제공한다. 정도 건지면 되겠네요.
1. 사용자가 search bar와 상호 작용
-> search controller는 searchResultsUpdater 속성으로 알림.
2. UISearchResultsUpdating 프로토콜을 준수하는
search resluts updater를 제공해야 한다.
3. UISearchResultsUpdating
-> 내용을 검색하고 결과를 search results view Controller로 전달
. 4. 일반적으로 검색 가능한 내용이 포함된 view Controller는
search results view Controller 역할을 함.
but 원하는 경우 다른 개체를 사용할 수 있습니다.
(아까 제 추측이 얼추 맞았네요)
1. search results view Controller에게 프레젠테이션 또는 dismissal을
커스텀하려면 search controller에게 delegate를 할당
2. delegate -> UISearchControllerDelegate 프로토콜을 준수
-> search controller가 활성화되고 search results view Controlle가 표시되거나 dismiss 될 때 알림을 받음.
자 개발 문서는 다 알아봤습니다.
조금 오역이 있을지 모르겠네요.
여하튼 요약하면
search controller
search bar
UISearchResultsUpdating
이 세 개를 잘 융합하면 되겠네요.
요약을 안 하는 이유는 요약해봤는데 말이 너무 어려워지네요.
자 베이스 소스(깃 before 브런치)를 열어주세요
스샷은 계속 베이스 소스 기준이지만
설명 잘 따라오시면
베이스 소스 아니라도 됩니다.
일단 HomeViewController부터 손보겠습니다.
일단 UISearchController를 생성해주세요.
그다음엔
navigationItem.searchController에 아까 만들어준 UISearchController를 넣어줍시다.
자 이제 필터를 해줄 함수를 만들어야 해요.
지금 우리 셀을 봅시다.
그리고
여길 보면
일본, 중국, 영국.... -> name
도쿄, 베이징, 런던... -> capital
이니까 이 두 개를 필터링하면 되겠네요
필터링 한 걸 변수에 담아 주는 건 뭐 보면 아실 것 같고
단일 표현식의 클로저라 임시적으로 반환되네요.
영단어라면 대문자를 소문자로 바꾸거나
소문자를 대문자로 바꿔서 필터링해야 하지만
우리는 한글이니까 그냥 필터링해도 괜찮을 것 같습니다.
자 그러면 남은 게 뭐죠?
UISearchResultsUpdating 네요.
프로토콜을 상속받으니 XCode에서 만들어주네요.
여기서는 검색 키워드를 받아서...
저 위에 만든 필터 함수에 던져주면 되겠네요.
저 함수에 이걸 적어줍시다
searchBar에 text가 옵셔널이니까 언랲핑 해주고
함수에 던져주면 됩니다.
아 그리고 저걸 채택해줍시다.
이제 테이블 뷰 셀 만드는 얘들을 분기만 갈라주면 되겠네요.
설명은 생략하겠습니다.
무언가에 의해 화면이 가려져서 검색 결과가 클릭이 안됩니다.
우리는 다시 애플 문서를 봅시다.
일단 3번째 거는 아닌 것 같은데...
검색하는 동안 기본 내용이 가려져 있는지 여부
검색 중에 기본 내용이 흐리게 표시되는지 여부
????? 무슨 차이인지 모르겠는데
첫 번째 꺼를 대신 쓰라고 아예 적혀있네요.
이제 빌드해봅시다.
오 가려지는 게 없어졌네요.
👏🏻 👏🏻 👏🏻
이제 클릭해봅시다.
하.. 네비가 없어지네요.
https://stackoverflow.com/questions/30937275/uisearchcontroller-doesnt-hide-view-when-pushed
여기를 보면
뷰 컨트롤러 또는 해당 하위 컨트롤러 중 하나가 뷰 컨트롤러를 표시할 때
이 뷰 컨트롤러의 뷰를 포함하는지 여부를 나타내는 Bool 이라네요..
허... 이게 무슨 소리일까요. 모르겠습니다...
다음 시간에 알아오겠습니다.... 흑..
각설하고 고칠려면
viewDidLoad()에
definesPresentationContext = true를 넣어주세요.
그렇게 실행하면 잘 됩니다.
혹시라도 잘 안되시면
제 마스터 소스를 한 번 보시거나 댓글 달아주세요.
참고로
이 글은 스위프트 5.0 기준으로 작성되었습니다
'Swift&IOS' 카테고리의 다른 글
Struct Vs Class 001 (0) | 2019.08.23 |
---|---|
Frame VS Bounds (0) | 2019.08.23 |
PageViewController 만들어보기. (0) | 2019.07.01 |
나만의 프레임 워크를 만들자!!! (0) | 2019.06.27 |
SwiftUI 탐방기 004 (0) | 2019.06.21 |
- Total
- Today
- Yesterday
- iOSCombine
- CombineLatest
- 현업이그리운
- 콤바인
- swift
- BBIK
- 유니온파인드
- Just
- compactMap
- 자료구조
- 스위프트유아이
- SwiftUI
- 스위프트
- 결합연산자
- SEQUENCE
- combine
- 스유
- replaceNil
- 삨
- Apple
- ErrorHandling
- programmers
- UIViewControllerRepresentable
- ios
- 텔큐온
- 알고리즘
- Queue
- MVC
- 스택뷰
- AutoLayout
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |