Проблема с выбором переключателя списка в SwiftUI

код: с помощью этого кода я могу установить несколько флажков для каждого вопроса, но когда дело доходит до выбора переключателя, я могу выбрать любой вариант вопроса... если я выберу другой вариант вопроса, то перед тем, как выбор вопроса будет удален, почему? как выбрать каждый вариант вопроса

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
                      }
      }

Пожалуйста, покажите минимальный воспроизводимый пример - что-то, что я могу скопировать и вставить в новый проект Xcode и воспроизвести проблему.

Sweeper 22.05.2024 11:52

@BenzyNeez, да, можно выбрать только один ответ, но нужно выбрать этот ответ в каждом вопросе.. с помощью моего кода я могу выбрать только один вопрос.. если я выберу другой вариант вопроса, то до того, как выбор вопроса исчезнет

Swift 22.05.2024 12:07

@JoakimDanielson, иногда, когда мы получаем ноль из серверной части, мы сделали все модели необязательными

Swift 22.05.2024 13:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я правильно понимаю, проблема в том, что когда вы выбираете ответ на второй вопрос с помощью переключателей, выбор ответа на первый вопрос с помощью переключателей снимается.

Мне удалось воспроизвести это, запустив ваш код (после импровизации всех недостающих частей). Проблема возникает потому, что идентификатор выбранного ответа хранится в 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 22.05.2024 12:39

@Swift Вы все еще сравниваете значение selectedOption в троичном условии имени изображения. Попробуйте скопировать/вставить код из ответа.

Benzy Neez 22.05.2024 13:01

окей, понял... дай мне попробовать

Swift 22.05.2024 13:09

@Swift Определение QuestionSurvey было одной из частей, отсутствующих в вопросе. Дело в том, что значение, которое вы записываете, должно также быть значением, которое вы читаете. Похоже, вы используете queID для записи в словарь, попробуйте systemName: (selectedSingleOptions[question.queID] == option.optID ? "largecircle.fill.circle" : "circle")

Benzy Neez 22.05.2024 13:11

Другие вопросы по теме