问题描述
I was looking here at this to try to solve my problem,许多人说这是在最新的 XCode 版本中修复的,但它对我不起作用,我使用的是支持 iOS 14.5 的最新公共 XCode 版本。我有几个数组,每个数组都包含名称、数字和描述等信息。我希望每一个都显示为按钮,然后在点击时显示具有该按钮独特视图的工作表。
这是我的一个数组的简短示例:
var discussionTask = [
Task(taskname: "Pick Up Around Your City",taskdescription: "Pick up and recycle litter",sfsymbolname: "trash.slash.fill",tokencount: 15),Task(taskname: "Go Paperless",taskdescription: "When possible,opt to use a digital device over paper.",Task(taskname: "Plant a Tree",taskdescription: "Plant a tree.",sfsymbolname: "leaf.fill",tokencount: 15)
]
在这个示例数组中,我想为每个 Task
制作一个按钮,因此在本例中将有 3 个按钮。第一个按钮应显示名称“Pick Up Around Your City”并带有数字“15”。单击时,我希望它显示所有数据,包括 taskdescription
和 sfsymbol
。
我目前尝试的所有内容只显示排序数组中的第一项,但我希望它为每个按钮显示一个唯一的工作表。我将继续添加更多内容,而不是列表中的三个项目。这是我目前正在尝试的:
func discussionTrackViewButton(tasknumber: Int) -> some View {
Button(action: {
print(tasknumber)
showTasksheet = true
},label: {
TrackBlockView(sfimagename: discussionTask.sorted { $0.taskname < $1.taskname }[tasknumber].sfsymbolname,taskname: discussionTask.sorted { $0.taskname < $1.taskname }[tasknumber].taskname,tokencount: String(discussionTask.sorted { $0.taskname < $1.taskname }[tasknumber].tokencount))
})
.sheet(isPresented: $showTasksheet) {
DetailedTrackView(sfsymbolname: discussionTask.sorted { $0.taskname < $1.taskname }[tasknumber].sfsymbolname,taskdetails: discussionTask.sorted { $0.taskname < $1.taskname }[tasknumber].taskdescription,tokencount: discussionTask.sorted { $0.taskname < $1.taskname }[tasknumber].tokencount,trackData: $trackdata,DailyGoalProgress: $DailyGoalProgress,TabSelection: $TabSelection,SavedDailyGoal: $SavedDailyGoal,DateSinceStreak: $DateSinceStreak,DaysOfStreak: $DaysOfStreak)
}
}
ForEach(0..<discussionTask.count) { index in
discussionTrackViewButton(tasknumber: index)
}
在这种情况下,它打印唯一的 tasknumber
并且按钮都是唯一的。但是,每当我单击任何按钮时,它只会显示第一个排序项目的信息。对于上下文,DetailedTrackView
只是我想要显示的详细信息屏幕。为什么会出现这个问题,我该如何解决?
提前致谢
解决方法
你可以这样做:
struct DiscussionTaskView: View {
var discussionTasks = [
Task(taskname: "Pick Up Around Your City",taskdescription: "Pick up and recycle litter",sfsymbolname: "trash.slash.fill",tokencount: 15),Task(taskname: "Go Paperless",taskdescription: "When possible,opt to use a digital device over paper.",Task(taskname: "Plant a Tree",taskdescription: "Plant a tree.",sfsymbolname: "leaf.fill",tokencount: 15)
]
@State var selectedTask: Task?
var body: some View {
VStack(spacing: 20) {
ForEach(discussionTasks) { task in
Button {
selectedTask = task
} label: {
Image(systemName: task.sfsymbolname)
}
.sheet(item: $selectedTask) { task in
VStack(alignment: .center,spacing: 20) {
Text(task.taskname)
.font(.headline)
Text(task.taskdescription)
Text("\(task.tokencount)")
Image(systemName: task.sfsymbolname)
}
}
}
}
}
}
这使用 .sheet(item:content:)
修饰符的 sheet
版本在点击相应按钮时显示每个项目。
它还假设您的 Task
结构符合 Identifiable
,如果还没有,这并不难做到。