@State private var selected: AppleProduct? = nil
List(items, selection: $selected) { item in
Button {
selected = item
} label: {
Text(item.name)
}
}
바인딩 없이 구현해도 동일하다.
List(items) { item in
Button {
selected = item
} label: {
Text(item.name)
}
}
selection으로 선택을 바인딩하려면 리스트가 개별 항목을 선택할때의 바인딩(UUID)와 바인딩한 State variable 타입이 같아야 한다. 혹은 인스턴스 전체로 항목을 구분하게 하면 된다.
struct SingleSelection: View {
var items = AppleProduct.sampleList
@State private var selected: AppleProduct? = nil
var body: some View {
VStack {
Text("Selected : \(selected?.name ?? "-")")
.font(.largeTitle)
List(items, id: \.self, selection: $selected) { item in
Button {
//selected = item
} label: {
Text(item.name)
}
}
}
.toolbar {
EditButton()
}
}
}
iOS 16 이상부터는 EditMode가 아닌 경우 단일 선택이 기본으로 동작하고, selected에 선택한 항목이 저장된다.
따라서 EditMode가 아니어도 다중선택이 되길 원한다면 selected파라미터를 없애면 된다.
selected파라미터를 사용할 경우엔 EditMode에서 체크박스가 지원된다.
struct MultiSelection: View {
var items = AppleProduct.sampleList
@State private var selected: Set<AppleProduct> = []
var body: some View {
VStack {
Text(" \(selected.count)item(s) selected")
.font(.title)
List(items, id: \.self) { item in
Button {
if selected.contains(item) {
selected.remove(item)
} else {
selected.insert(item)
}
} label: {
if selected.contains(item) {
Label("\(item.name)", systemImage: "checkmark")
} else {
Text(item.name)
}
}
}
}
.toolbar {
#if os(iOS)
EditButton()
#endif
}
}
}