[SwiftUI] 검색 구현 Searchable

RudinP·2025년 6월 24일
0

Study

목록 보기
292/365

1. 바인딩할 검색단어 변수 추가

@State private var keyword = ""

2. .searchable 모디파이어 추가

  • text엔 검색 단어 바인딩
  • placement는 .automatic으로 하면 적합한 위치에 서치바 표시(네비게이션 바 있으면 네비게이션 바에 추가)
  • prompt엔 검색창의 placeholder 입력
  • suggestions는 검색 제안 클로저
List {
	...
}
.searchable(text: $keyword, prompt: "내용을 검색합니다.")

3. .onchange 모디파이어 추가

nsPredicate를 사용한다.

.onChange(of: keyword) {
	if keyword.isEmpty {
	//저장된 전체 메모 표시
    	memoList.nsPredicate = nil
	} else {
		memoList.nsPredicate = NSPredicate(format: "content CONTAINS[c] %@", keyword)
	}
                
}

검색바 항상 표시하기

  • navigationBarDrawer 사용
  • sidebar, toolbar는 macOS 관련
.searchable(text: $keyword, placement: .navigationBarDrawer(displayMode: .always), prompt: "검색어를 입력하세요") {
}

search를 눌렀을때만 검색되게 하기

  • onChange가 아닌 onSubmit(of: .search) 사용
  • 검색 종료시 목록 초기화하는 코드를 추가해야한다. (onChange)
		.onChange(of: keyword) { newValue in
            if newValue.count == 0 {
                items = AppleProduct.sampleList
            }
        }
        .onSubmit(of: .search) {
            if keyword.count > 0 {
                items = AppleProduct.sampleList.filter {
                    $0.name.contains(keyword)
                }
            } 
        }

검색 제안

.searchable(text: $keyword, placement: .navigationBarDrawer(displayMode: .always), prompt: "검색어를 입력하세요") {
            Text("Mac")
            Label("MacBook", systemImage: "laptopcomputer")
            
        }

  • 검색 제안 추가시 자동으로 검색되지 않고 키보드의 search버튼을 탭해야 검색 작동
  • 검색 제안을 선택 시 검색이 작동되도록 searchCompletion을 추가해야 한다.
		.searchable(text: $keyword, placement: .navigationBarDrawer(displayMode: .always), prompt: "검색어를 입력하세요") {
            Text("Mac").searchCompletion("Mac")
            Label("MacBook", systemImage: "laptopcomputer").searchCompletion("MacBook")
            
        }


example

struct Search: View {
    @State private var keyword = ""
    @State private var items = AppleProduct.sampleList
    
    var body: some View {
        List(items) { item in
            Text(item.name)
        }
        .searchable(text: $keyword, placement: .automatic, prompt: "검색어를 입력하세요") {
            
        }
        .onChange(of: keyword) { newValue in
            if newValue.count > 0 {
                items = AppleProduct.sampleList.filter {
                    $0.name.contains(newValue)
                }
            } else {
                items = AppleProduct.sampleList
            }
        }
    }
}

profile
iOS 개발자가 되기 위한 스터디룸...

0개의 댓글