관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 검색 창, 테이블뷰 (UISearchController, ContainerView, tableView, UISearchController) 본문

iOS 응용 (swift)

[iOS - swift] 검색 창, 테이블뷰 (UISearchController, ContainerView, tableView, UISearchController)

jake-kim 2021. 6. 26. 03:13

UISearchController, ContainerView, tableView

* UISearchBar HIG 참고: https://ios-development.tistory.com/505

 

[iOS - HIG] 31. Search Bars (검색창)

Search Bars UITextField가 아닌 SearchBar 사용 TextField는 사용자들이 기대하는 표준 검색 창 모양이 아님을 주의 Search bar는 텍스트 입력 시 clear버튼이 자동으로 내장되어 있고, 키보드에 "검색"이나 "s..

ios-development.tistory.com

UISearchController의 구조

구현


SceneDelegate 삭제

  • SceneDelegate.swift 삭제
  • info.plist에 "Main storyboard file base name" = "Main" 부분 삭제
  • info.plist에 Application Scene Manifest 삭제
  • AppDelegate.swift에 UISsceneSession Lifecycle 관련 메소드 2개 삭제

Container View안에 UITableView 삽입

  • UIViewController에 내장될 UITableView 생성

  • UIViewController안에 ContainerView 삽입
    • 자동으로 View Controller 생성

  • ContainerView를 TableView의 크기 레이아웃 설정 > embed segue로 이어진 View Controller 삭제

  • containerView에서 embed segue로 UITableView 연결

UISearchController

  • xib에서는 지원하지 않으므로 code로 구현
  • UIView로 자리를 먼저 남겨놓고 거기에 SearchBar 삽입
    // ViewController.swift
    private var searchController: UISearchController = {
        return UISearchController(searchResultsController: nil)
    }()
  • 검색 창 초기화
    • obscuresBackgroundDuringPresentation:
      - 검색창에 포커스가 모달 방식 (뒷 배경 약간 어두워지는 처리 + 탭해도 선택 안되는 상태)
      - false 설정 케이스: 동일한 뷰 컨트롤러를 사용하여 검색 가능한 컨텐츠 및 검색 결과를 표시하는 경우
// MARK: - Search Controller

extension ViewController {
    private func setupSearchBar() {
        searchController.delegate = self
        searchController.searchBar.delegate = self
        searchController.obscuresBackgroundDuringPresentation = false
        searchController.hidesNavigationBarDuringPresentation = false

        searchController.searchBar.barStyle = .default
        searchController.searchBar.placeholder = "검색 창"

        searchController.searchBar.translatesAutoresizingMaskIntoConstraints = true
        searchController.searchBar.frame = searchBarContainerView.bounds
        searchController.searchBar.autoresizingMask = [.flexibleWidth]
        searchBarContainerView.addSubview(searchController.searchBar)
        definesPresentationContext = true
    }
}
  • delegate
extension ViewController: UISearchControllerDelegate {
    func willPresentSearchController(_ searchController: UISearchController) {
        print(#function, "updateQueriesSuggestions")
    }

    func willDismissSearchController(_ searchController: UISearchController) {
        print(#function, "updateQueriesSuggestions")
    }

    func didDismissSearchController(_ searchController: UISearchController) {
        print(#function, "updateQueriesSuggestions")
    }
}

extension ViewController: UISearchBarDelegate {
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        guard let searchText = searchBar.text, !searchText.isEmpty else { return }
        searchController.isActive = false
        print(searchText)
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        print("cancel")
    }
}

* source code: https://github.com/JK0369/SearchBarEx

Comments