SwiftUI Список выбора не выбирает
Я пытаюсь использовать выбор списка для пользователя, чтобы ноль или более дней из списка. Я пытался использовать решение, указанное в этом вопросе, но безрезультатно.
Мой код указан ниже, и я подтвердил, что режим редактирования активен. Я должен ожидать поведение, как в ответе, связанном с выше.
Код:
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)
}
}
Таблица должна отображать поведение выбора, как и в другом ответе, но в настоящее время она отображается как обычный список в режиме редактирования.
1 ответ
Форма мешает EditMode распространяться (или работать в любом случае правильно). Единственный путь - не встраивать его в форму и надеяться, что он получит исправление перед выпуском (в настоящее время 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()
}
}
Я немного боролся с этим, и ответ не то, что думал @Fabian.
Вам нужно использовать .onDelete()
иначе пузыри выбора не появятся:
Form {
Section(header: Text("Overtime Days")) {
List(self.weekdays, id: \.self, selection: $selectKeeper) { day in
Text(day)
}
.onDelete(perform: noOp)
}
}
.navigationBarTitle(Text("My Title"))