我正在构建一个文件管理器应用程序。
在这个应用程序中,用户可以在列表中选择一个特定的文件夹。也可以选择"所有文件夹"选项。这是列表中的第一个元素。
我想将选中的文件夹保存在AppState类中,如果用户选择了"All Folders"
,将其设置为nil
class AppState: ObservableObject {
@Published var selectedFolder: Folder?
}
struct FileListView: View {
@EnvironmentObject
var appState: AppState
var body: some View {
List() {
FileRowView(
title: "All Files",
)
.onTapGesture {
appState.selectedFolder = nil
}
ForEach(filesList) {
file in
FileRowView(
title: file.title ?? "File unnamed",
)
.onTapGesture {
appState.selectedFolder = folder
}
}
}
}
}
即使这段代码可以工作并且selectedFolder
已经更新,List也不会在View实际选中的元素中突出显示。它没有这种"蓝色"。外观和感觉通常应用于列表中的选定项。
- 您需要的列表版本,保持跟踪选择:
List(selection: )
。 - 即使绑定选择变量是可选的,您也不能将
nil
用于List元素。nil
to the List表示未选择任何内容。 - 使用List初始化器,您不需要
onTapGesture
,只需为每一行提供与您的选择变量相同类型的.tag()
。
下面是一个简化的例子:
struct FileListView: View {
@State var selectedFolder: Int?
var body: some View {
List(selection: $selectedFolder) {
Text("All Files")
.tag(999)
ForEach(0..<10) { file in
Text("file (file)")
.tag(file)
}
}
}
}