微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 ForEach 在 SwiftUI 中按按钮制作独特的表格?

如何解决使用 ForEach 在 SwiftUI 中按按钮制作独特的表格?

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”。单击时,我希望它显示所有数据,包括 taskdescriptionsfsymbol

我目前尝试的所有内容显示排序数组中的第一项,但我希望它为每个按钮显示一个唯一的工作表。我将继续添加更多内容,而不是列表中的三个项目。这是我目前正在尝试的:

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,如果还没有,这并不难做到。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。