CoreData #2
검색 기능
List {
ForEach(members) { member in
Button {
editTarget = member
} label: {
HStack {
Text(member.name!)
.foregroundColor(.primary)
Spacer()
Text("\(member.age)")
.foregroundColor(.secondary)
}
}
}
.onDelete(perform: delete(at:))
}
.searchable(text: $keyword)
.onChange(of: keyword, perform: { newValue in
members.nsPredicate = newValue.isEmpty ? nil : NSPredicate(format: "name CONTAINS[c] %@", newValue)
})
List에 searchable modifier를 추가하고, State 변수를 바인딩으로 전달한다.
해당 변수가 변경될 때 반응할 수 있도록 onChange modifier를 사용해 Predicate를 수정해 검색 결과를 표시한다.
정렬 기능
struct SortType: Identifiable, Hashable {
let id = UUID()
let title: String
let descriptors: [SortDescriptor<MemberEntity>]
static let types = [
SortType(title: "이름 오름차순(ㄱ~ㅎ)", descriptors: [SortDescriptor(\.name, order: .forward)]),
SortType(title: "이름 내림차순(ㅎ~ㄱ)", descriptors: [SortDescriptor(\.name, order: .reverse)]),
SortType(title: "나이 오름차순", descriptors: [SortDescriptor(\.age, order: .forward)]),
SortType(title: "나이 내림차순", descriptors: [SortDescriptor(\.age, order: .reverse)]),
]
}
정렬 방식을 먼저 구현한다.
각각 이름 혹은 나이를 기준으로 오름차, 내림차로 정렬한다.
ToolbarItem(placement: placement) {
Menu {
Picker("", selection: $selectedSortType) {
ForEach(SortType.types) { type in
Text(type.title)
}
}
} label: {
Label("Sort", systemImage: "arrow.up.arrow.down")
}
}
ToolbarItem으로 Menu를 하나 생성하고,
구현한 정렬 방식의 이름을 ForEach를 사용해 열거해 표시한다.
선택은 selectedType에 저장된다.
.onChange(of: selectedSortType, perform: { newValue in
let criteria = SortType.types.first { target in
target.id == newValue
} ?? SortType.types[0]
members.sortDescriptors = criteria.descriptors
})
selectedSortType이 변경되면 이에 반응해 List의 정렬 기준을 변경한다.
first로 현재 selectedSortType과 같은 SortType을 찾아 List에 표시하는 데이터에 적용한다.
'학습 노트 > Swift UI (2022)' 카테고리의 다른 글
33. AppStorage & SceneStorage (0) | 2022.11.17 |
---|---|
31. CoreData #1 (0) | 2022.11.16 |
30. Gesture (0) | 2022.11.16 |
29. List의 부가 기능 구현하기 (0) | 2022.11.10 |
28. ForEach & Grid (0) | 2022.11.09 |