Implement a custom and reusable search bar | SwiftUI Crypto App #10
searchText
를 통해 서치 바의 텍스트 필드와 연결TextField("Search by name or symbol...", text: $searchText)
.autocorrectionDisabled(true)
.foregroundColor(Color.theme.accent)
.overlay(
Image(systemName: "xmark.circle.fill")
.padding()
.offset(x: 10)
.foregroundColor(Color.theme.accent)
.opacity(searchText.isEmpty ? 0.0 : 1.0)
.onTapGesture {
searchText = ""
UIApplication.shared.endEditing()
}
, alignment: .trailing
)
X
마크 클릭 시 텍스트 필드 전체 텍스트 초기화 및 키보드 디스미스SearchBarView(searchText: $viewModel.searchText)
...
@Published var searchText: String = ""
searchText
바인딩에 연결한 퍼블리셔는 홈 뷰 모델에서 선언import SwiftUI
struct SearchBarView: View {
@Binding var searchText: String
var body: some View {
HStack {
Image(systemName: "magnifyingglass")
.foregroundColor(
searchText.isEmpty ?
Color.theme.secondaryText : Color.theme.accent)
TextField("Search by name or symbol...", text: $searchText)
.autocorrectionDisabled(true)
.foregroundColor(Color.theme.accent)
.overlay(
Image(systemName: "xmark.circle.fill")
.padding()
.offset(x: 10)
.foregroundColor(Color.theme.accent)
.opacity(searchText.isEmpty ? 0.0 : 1.0)
.onTapGesture {
searchText = ""
UIApplication.shared.endEditing()
}
, alignment: .trailing
)
}
.font(.headline)
.padding()
.background(
RoundedRectangle(cornerRadius: 25)
.fill(Color.theme.background)
.shadow(
color: Color.theme.accent.opacity(0.5),
radius: 10, x: 0, y: 0)
)
.padding()
}
}
State
오브젝트와 연결된 바인딩(홈 뷰 모델의 @Published
로 선언된 searchText
퍼블리셔와 연결)isEmpty
를 통해 카운트X
버튼 클릭 시 텍스트 전체 삭제 및 키보드 자동 디스미스
import Foundation
import SwiftUI
extension UIApplication {
func endEditing() {
sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
}