SwiftUI 列表选择不选择

标签 swift swiftui swiftui-list

我正在尝试使用列表选择,让用户从列表中选择零天或更多天。我尝试使用 this question 中列出的解决方案,但无济于事。

下面给出了我的代码,并且我已经验证编辑模式处于事件状态。我应该期待像上面链接的答案中那样的行为。

代码:

struct EditView: View {

    @State var selectKeeper = Set<String>()
    var weekdays: [String] = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
    @Environment(\.editMode) var mode

    var body: some View {

            Form {

                Section(header: Text("Overtime Days")) {

                    List(self.weekdays, id: \.self, selection: $selectKeeper) { day in
                        Text(day)
                    }

                }

            }   .navigationBarTitle(Text("My Title"))
                .padding(.top)
                .onAppear(perform: {
                    print(self.mode?.value as Any)
                })

        }
}

EditButton 包含在父 View 中,并在以下代码段中启用。

struct JobDetailHost: View {

    @Environment(\.editMode) var mode
    @Binding var jobDetails: JobDetails

    var body: some View {

        VStack {

                if self.mode?.value == .inactive {
                    JobDetailView(jobDetails: jobDetails)
                } else {
                    EditView(jobDetails: $jobDetails)
                        .onDisappear(perform: {
                            //DO STUFF...
                        })
                } 
        }
        .navigationBarItems(trailing: EditButton())
        .onAppear(perform: bindDraft)


    }
}

表格应显示与其他答案中一样的选择行为,但目前它在编辑模式下仅显示为普通列表。

最佳答案

Form 确实会阻止 EditMode 传播(或无论如何都可以正常工作)。唯一的方法是不要将其嵌入 Form 中,并希望它在发布之前得到修复(目前是 XcodeBeta5,正在报告......)。

import SwiftUI

struct SelectionView: View {
    @Binding var jobDetails: JobDetails

    var weekdays: [String] = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

    var body: some View {
        VStack{
            List(self.weekdays, id: \.self, selection: $jobDetails.weekdays) { day in
                Text(day)
            }
        }
    }
}

struct JobDetails: Identifiable {
    let id = UUID()
    var weekdays = Set<String>()
}

struct JobDetailsView: View {
    let jobDetails: JobDetails

    var body: some View {
        HStack{
            Text("Weekdays:")
            Text(jobDetails.weekdays.joined(separator: ", "))
        }
    }
}

struct JobDetailHost: View {

    @Environment(\.editMode) var mode
    @Binding var jobDetails: JobDetails

    var isEditing: Bool {
        return mode?.value == .inactive
    }

    var body: some View {

        VStack {
            //HStack{ Spacer(); EditButton().padding() }
            ZStack{
                if isEditing {
                    JobDetailsView(jobDetails: jobDetails)
                } else {
                    SelectionView(jobDetails: $jobDetails)
                }
            }
        }.navigationBarItems(trailing: EditButton())
    }
}

struct JobsView: View {
    @State var jobDetails: [JobDetails] = [
        JobDetails(),
        JobDetails(),
        JobDetails(),
        JobDetails(),
    ]

    var body: some View {
        NavigationView{
            List($jobDetails) { (jobDetail: Binding<JobDetails>) in
                NavigationLink(jobDetail.id.uuidString, destination: JobDetailHost(jobDetails: jobDetail))
            }
        }
    }
}


struct ListSelection2View: View {
    var body: some View {
        JobsView()
    }
}

关于SwiftUI 列表选择不选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57527556/

相关文章:

ios - 如何在 SwiftUI 列表/ForEach 中动态创建部分并避免 "Unable to infer complex closure return type"

ios - SwiftUI TapGesture 无法在 iOS 上的列表中使用 NavigationLink

swift - 如何在 RealityKit 中隐藏 ModelEntity?

arrays - 追加数组自定义函数不起作用

Swift,约束, View 层次结构没有为约束准备

ios - SpriteView 不会在状态更改时暂停场景

swiftui-list - 喜欢带有 GroupedListStyle SwiftUI View 的LargeTitles

ios - 在表格 View 的单元格中设置标签的位置

ios - 字符串:字符串?数组而不是String:String数组在SwiftUI View 中中断了ForEach?

swift - 在 SwiftUI 应用程序中放置音频播放代码的位置