And here is the code
struct QuizContentView: View {
@Binding var currentQuestionNumber: Int
@Binding var expVisibility: Bool
@ObservedObject var dataManager: DataManager = DataManager.shared
var onAnswerSelectedClosure: ((Int) -> Void)?
var body: some View {
if dataManager.currentQuiz.questionsForCurrentTest.count > 0 {
ZoomableImageView(graphic:dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].content.graphic)
ScrollViewReader { proxy in
List{
if (AppSettings.isTestingPhaseActive()){
Text(dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].id)
}
EmptyView().id("scrollToPos")
QuestionTextView(text:dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].instruction, isInstruction: true)
.italicText()
.listRowInsets(EdgeInsets()) // Removes the default padding
.listRowBackground(Colors.questionBackground)
QuestionTextView(text:dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].processedQuestionText)
.listRowInsets(EdgeInsets()) // Removes the default padding
.listRowBackground(Colors.questionBackground)
if (AppSettings.isMultipleAnswerSelectionAllowed()){
PromptView(text: dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].prompt)
.listRowInsets(EdgeInsets()) // Removes the default padding
.listRowBackground(Colors.promptBackground)
}
ForEach(dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].answers.indices, id:\.self) { index in
SingleAnswerView(text: dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].answers[index].content.text,
graphic: dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].answers[index].content.graphic,
fillColor: Colors.getAnswerColor(question: dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber],answerIndex: index,isReviewMode:dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].explanation.visibility)
){
if (dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].explanation.visibility == false){
if let closure = onAnswerSelectedClosure {
closure(index)
}
}
}
.id(index)
}//for each
if(dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].explanation.visibility ) {
ExplanationView(text:dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].explanation.content.text,
graphic:dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].explanation.content.graphic, reference: dataManager.currentQuiz.questionsForCurrentTest[currentQuestionNumber].reference, fillColor: Colors.explanationBackground)
}
}//list
.listStyle(.plain) //to make entire screen white
//MARK:scroll issue fix below with two .onChange methods, note expVisibility and explanation.visibility must be separate for reviewing
.onChange(of: expVisibility) { [oldValue = expVisibility] newValue in
if oldValue == false && newValue == true {
withAnimation {
proxy.scrollTo("ExplanationLabel" , anchor: .bottomTrailing)
}
}
}
.onChange(of: currentQuestionNumber) { _ in
withAnimation {
proxy.scrollTo("scrollToPos", anchor: .topLeading) //first answer
}
}
}//scrollview reader of list
}
}
}