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"))
Другие вопросы по тегам