목표
UISearchBar를 클릭했을때 화면 이동이 되게끔 구현해보자.
먼저 당연히 SearchBar를 구현해놓아야 하고, 우리가 만질 부분은 SearchBar를 클릭시 발생하는 액션 부분.
선행작업
UISearchBar는 addTarger이라는 속성이 없기 때문에, delegate 패턴을 사용해야 한다.
SearchBar UI 구현
let searchBar = UISearchBar().then {
$0.placeholder = "검색"
$0.searchBarStyle = .minimal
$0.backgroundImage = UIImage()
}
view.addSubview(searchBar)
searchBar.snp.makeConstraints {
$0.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(10)
$0.leading.trailing.equalToSuperview().inset(10)
$0.height.equalTo(40)
}
Then이라는 라이브러리를 사용하여 searchBar를 선언하였다.
따라서 Then을 사용한다면 아래와 같이, 아니라면 기존 방식대로 작성하면 된다.
let searchBar = UISearchBar()
searchBar.placeholder = "검색"
searchBar.searchBarStyle = .minimal
searchBar.backgroundImage = UIImage()
UISearchBarDelegate 프로토콜 채택
class MainVC: UIViewController, UISearchBarDelegate {
}
SearchBar Delegate 설정
override func viewDidLoad() {
super.viewDidLoad()
searchBar.delegate = self // 서치바 delegate 설정
}
클릭 시 구현
첫번째 코드
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) -> Bool {
let searchVC = SearchVC()
navigationController?.pushViewController(searchVC, animated: true)
return false
}
UISearchBarDelegate라는 프로토콜에서 제공하는 searchBarSearchButtonClicked라는 메서드는,
서치바에 검색어를 입력하고, 키보드 상에서 리턴키를 입력했을때 호출되는 메서드이다.
따라서 현재 서치바를 클릭하는 것만으로도 따로 구현한 검색 뷰로 이동시키기에는 적합하지 않은 메서드이다.
두번째 코드
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
let searchVC = SearchVC()
navigationController?.pushViewController(searchVC, animated: true)
return false
}
UISearchBarDelegate라는 프로토콜에서 제공하는 searchBarShouldBeginEditing이라는 메서드는,
서치바를 클릭하여 편집을 시작하려고 할 때, 즉 서치바를 클릭했을 때 호출되는 메서드이다.
따라서 서치바를 클릭 -> 따로 구현한 검색 뷰로 이동.
적합한 메서드이다.
그리고 false를 리턴함으로써, 편집모드에 진입하지 않는다.
편집모드에 진입함이라 함은, 서치바에 커서가 깜빡이고 검색을 위해 키보드가 올라오는 상태를 의미한다.
따라서 true를 리턴한다면 당연히 편집모드에 진입한다.
하지만 위의 코드도 작동하지 않는 경우가 있고, 저걸 navigationController를 이용한 pushViewController는 작동하지 않고,
아래의 코드처럼 present를 이용한 모달창은 작동하는 경우가 있다.
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
let searchVC = SearchVC()
present(searchVC, animated: true, completion: nil)
return false
}
이럴때는 SceneDelegate에서 rootViewController를 navigationController로 변경해주면 된다.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// UIWindowScene 객체 생성.
guard let windowScene = (scene as? UIWindowScene) else { return }
let window = UIWindow(windowScene: windowScene)
// window에게 루트 뷰 컨르롤러 지정.
window.rootViewController = UINavigationController(rootViewController: MainVC())
// 이 메서드를 반드시 작성해줘야만 윈도우가 활성화 됨
window.makeKeyAndVisible()
self.window = window
}
이런식으로 rootViewController를 UINavigationViewController로 한번 감싸주면 해결이 된다.
전체 코드
import UIKit
import SnapKit
import Then
class MainVC: UIViewController, UISearchBarDelegate {
let searchBar = UISearchBar().then {
$0.placeholder = "검색"
$0.searchBarStyle = .minimal
$0.backgroundImage = UIImage()
}
override func viewDidLoad() {
super.viewDidLoad()
configureUI()
searchBar.delegate = self // 서치바 delegate 설정
}
// MARK: UI 구성
func configureUI() {
view.addSubview(searchBar)
searchBar.snp.makeConstraints {
$0.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(10)
$0.leading.trailing.equalToSuperview().inset(10)
$0.height.equalTo(40)
}
}
// MARK: 서치바 클릭시 동작
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
let searchVC = SearchVC()
navigationController?.pushViewController(searchVC, animated: true)
print("검색버튼 클릭 됨 | 이동완료")
return false
}
}
'OS > iOS' 카테고리의 다른 글
[UIKit / iOS / Swift] view.addSubview와 contentView.addSubview의 차이 (0) | 2025.01.13 |
---|---|
[iOS / Swift] UINavigationBar를 구현해보자. (0) | 2025.01.08 |
[iOS / Swift] Then 라이브러리 (1) | 2024.12.27 |
[iOS / Swift] 라이브러리 SnapKit이란? (0) | 2024.12.24 |
[Swift / iOS] LaunchScreen 설정 (UIKit, Storyboard) (0) | 2024.12.16 |
살아남는 iOS 개발자가 되기 위해 끊임없이 노력하고 있습니다.