код: с помощью этого кода я могу установить несколько флажков для каждого вопроса, но когда дело доходит до выбора переключателя, я могу выбрать любой вариант вопроса... если я выберу другой вариант вопроса, то перед тем, как выбор вопроса будет удален, почему? как выбрать каждый вариант вопроса
struct SurveyQuestionsView: View {
@Environment(\.dismiss) var dismiss
@StateObject private var viewModel = SurveyViewModel()
@State var id: String = ""
@State private var selectedOption: Int? = nil
@State private var selectedOptions: Set<Int> = []
var body: some View {
ZStack {
VStack(alignment: .leading) {
Text("(*) Mandatory Questions")
.font(.calibriRegular(with: 15))
.foregroundStyle(.red)
.padding()
ScrollView{
ForEach(0..<viewModel.questionsArray.count, id: \.self) {i in
questionOptionsCell(question: viewModel.questionsArray[i])
Rectangle()
.frame(height: 3)
.foregroundColor(Color.hexF4F4FC)
}
}
Spacer()
}
}
.onAppear{
viewModel.fetchQuestionOptions(id: id) { status in
}
}
}
@ViewBuilder
func questionOptionsCell(question: QuestionSurvey) -> some View {
VStack(alignment: .leading) {
HStack {
Text(question.question ?? "N/A")
.font(.calibriRegular(with: 17))
.foregroundStyle(.green)
.padding(.leading, 10)
if question.isMultiSelect ?? false {
Text("*")
.foregroundColor(.red)
}
}
ForEach(question.options ?? [], id: \.optID) { option in
HStack {
if question.isMultiSelect ?? false {
Image(systemName: selectedOptions.contains(option.optID!) ? "checkmark.square" : "square")
.onTapGesture {
if selectedOptions.contains(option.optID!) {
selectedOptions.remove(option.optID!)
} else {
selectedOptions.insert(option.optID!)
}
}
} else {
Image(systemName: (selectedOption == option.optID ? "largecircle.fill.circle" : "circle"))
.onTapGesture {
if selectedOption != option.optID {
selectedOption = option.optID
}
}
}
Text(option.option ?? "Option")
.onTapGesture {
if question.isMultiSelect ?? false {
if selectedOptions.contains(option.optID!) {
selectedOptions.remove(option.optID!)
} else {
selectedOptions.insert(option.optID!)
print("selectedOption.... \(selectedOptions)")
}
} else {
selectedOption = option.optID
print("selectedOption.... \(selectedOption)")
}
}
Spacer()
}
.padding(.vertical, 5)
.padding(.leading, 15)
}
}
}
}
о/п
изменить: это модель QuestionSurvey
struct QuestionSurvey: Codable {
let queID: Int?
let question: String?
let isMultiSelect, isAnsMandatory: Bool?
let response: Int?
var options: [Option]?
}
пробовал так, проблема все та же
else {
Image(systemName: (selectedOption == option.optID ? "largecircle.fill.circle" : "circle"))
.onTapGesture {
selectedSingleOptions[question.queID ?? 0] = option.optID ?? 0
}
}
@BenzyNeez, да, можно выбрать только один ответ, но нужно выбрать этот ответ в каждом вопросе.. с помощью моего кода я могу выбрать только один вопрос.. если я выберу другой вариант вопроса, то до того, как выбор вопроса исчезнет
@JoakimDanielson, иногда, когда мы получаем ноль из серверной части, мы сделали все модели необязательными





Если я правильно понимаю, проблема в том, что когда вы выбираете ответ на второй вопрос с помощью переключателей, выбор ответа на первый вопрос с помощью переключателей снимается.
Мне удалось воспроизвести это, запустив ваш код (после импровизации всех недостающих частей). Проблема возникает потому, что идентификатор выбранного ответа хранится в selectedOption, что фактически означает, что у вас есть только одна группа переключателей.
Чтобы это исправить, вам нужно иметь одну переменную для каждой группы переключателей. Вы можете сделать это, используя словарь, основанный на идентификаторе вопроса.
Предполагая, что каждый вопрос имеет идентификатор Int:
@State private var selectedSingleOptions = [Int: Int]()
if question.isMultiSelect ?? false {
// ...
} else {
Image(systemName: (selectedSingleOptions[question.id] == option.optID ? "largecircle.fill.circle" : "circle"))
.onTapGesture {
selectedSingleOptions[question.id] = option.optID ?? 0
}
}
та же проблема... добавлена модель и мой опробованный код в сообщении выше... пожалуйста, посмотрите
@Swift Вы все еще сравниваете значение selectedOption в троичном условии имени изображения. Попробуйте скопировать/вставить код из ответа.
окей, понял... дай мне попробовать
@Swift Определение QuestionSurvey было одной из частей, отсутствующих в вопросе. Дело в том, что значение, которое вы записываете, должно также быть значением, которое вы читаете. Похоже, вы используете queID для записи в словарь, попробуйте systemName: (selectedSingleOptions[question.queID] == option.optID ? "largecircle.fill.circle" : "circle")
Пожалуйста, покажите минимальный воспроизводимый пример - что-то, что я могу скопировать и вставить в новый проект Xcode и воспроизвести проблему.