본문 바로가기

학습 노트/Swift UI (2022)

32. CoreData #2

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