티스토리 뷰

Swift&IOS

UISearchController

밀쿄 2019. 7. 4. 18:10

안녕하세요. 밀쿄입니다.

오늘은 UISearchController에 대해서 알아보겠습니다.

SwfitUI 더 나가기 전에 UIKit에 있는 컨트롤러란 컨트롤러는 다 만져보고 있는 것 같네요.

같이 볼 애플 문서는 여기

https://developer.apple.com/documentation/uikit/uisearchcontroller

 

UISearchController - UIKit | Apple Developer Documentation

A set of methods that let you update search results based on information the user enters into the search bar.

developer.apple.com

설명한 필요한 소스는 여기

https://github.com/dp221125/Swift_UISearchBar_Example

 

dp221125/Swift_UISearchBar_Example

Swift 5.0 . Contribute to dp221125/Swift_UISearchBar_Example development by creating an account on GitHub.

github.com

참고로 소스는 브런치를 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

 

UISearchController doesn't hide view when pushed

I am using UISearchController to display a search bar and results within a UITableView. I managed to set it up correctly, but when I search the results and then select one of the rows in the tablev...

stackoverflow.com

여기를 보면

뷰 컨트롤러 또는 해당 하위 컨트롤러 중 하나가 뷰 컨트롤러를 표시할 때

이 뷰 컨트롤러의 뷰를 포함하는지 여부를 나타내는 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
링크
«   2024/11   »
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
글 보관함