我正在尝试使用列表选择,以便用户从列表中选择零天或更多天。我试图使用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包含在父视图中,并在下面的代码中启用。
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)
}
}
该表应该像在另一个答案中一样显示选择行为,但当前它在编辑模式下仅显示为一个普通列表。
最佳答案
表单确实会阻止EditMode传播(或仍然正常工作)。唯一的方法是不要将它嵌入到表单中,希望它在发布之前得到修复(目前是XcodeBeta5,reporting…)。
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()
}
}