ios - 如何仅显示 SwiftUI 列表中的选定项目?
问题描述
当 editMode 为 .inactive 时,如何让 List 显示一组选定项目,而当 editMode 为 .active 时显示所有可选选项,以便用户可以更改选定项目集?这是我尝试过的:
import SwiftUI
struct SelectionView: View {
@Environment(\.editMode) var editMode
@State var selectedItems = Set<String>(["1-item", "2-item", "3-item", "4-item"])
let allItems = ["1-item", "2-item", "3-item", "4-item"]
var items: [String] {
if editMode?.wrappedValue == .inactive {
return Array(selectedItems)
}
else {
return allItems
}
}
var body: some View {
NavigationView {
List(items, id: \.self, selection: $selectedItems) { item in
Text(item)
}
.navigationBarItems(trailing: EditButton())
.navigationBarTitle("Items")
}
}
}
选定的数组现在是无序的,因为它是从一组生成的,我最终希望它以正确的顺序排列。但我首先尝试让列表按原样工作。
解决方案
这是它如何为我工作的方法。不幸的是,由于List
内部细节(或错误),它并不完全好......
想法是List
根据选定的项目切换过滤其中一个的容器,而切换本身取决于手动跟踪EditMode
无论如何它都有效(使用 Xcode 11.2/iOS 13.2 测试,以及预览版)
struct SelectionView: View {
@State var editMode: EditMode = .inactive // ! Needed manual to track states
@State var selectedItems = Set<String>(["1-item", "2-item", "3-item", "4-item"])
let allItems = ["1-item", "2-item", "3-item", "4-item"]
var items: [String] {
allItems.filter { self.selectedItems.contains($0) }
}
@State var applyFilter = false
var body: some View {
NavigationView {
VStack {
List(applyFilter ? items : allItems, id: \.self,
selection: $selectedItems) { item in
Text(item)
}
.navigationBarItems(trailing: EditButton())
.navigationBarTitle("Items")
}
// .environment(\.editMode, $editMode) // << this is how it should be, but crash
.environment(\.editMode, Binding<EditMode>(get: { self.editMode },
set: {
self.editMode = $0
// !!! below is needed workaround, because applying filter directly
// on close EditMode result in crash due to cached List internals
// until switch EditMode animation is finished completely
if $0 == .inactive {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
self.applyFilter = true
}
} else {
self.applyFilter = false
}
}))
}
}
}
推荐阅读
- c# - VueJs/Axios - 如何通过 API 调用在浏览器中下载 pdf 文件
- terraform - 两个 aws 帐户的 Terraform 结构
- python - ImportError 上的问题:numpy.core.multiarray 导入失败
- android-studio - 如何在 React Native 项目中使用我的带有“*.aar”扩展名的自定义库
- c# - 整体或特定字段更新 mongo 文档
- .net - 为什么我的 WCF 代理发送带有 Content-Type: application/xml 的 JSON?
- asp.net-mvc - 复杂角色授权 Asp.net core MVC
- intellij-idea - Intellij 支持 UML 活动图
- java - 为什么使用此 WSDL 时我的 SOAP 请求总是空的?
- eclipse - 如何在调试期间在 FreeRTOS 任务列表中显示运行时