Я пытаюсь создать динамический c вид, чтобы ответить на некоторые вопросы. Эти вопросы создаются из моего бэк-офиса, и следующий вопрос зависит от ответа текущего пользователя. Поэтому я должен строить свою точку зрения по мере прогресса.
Вот пример:
Первый вопрос:
Are you alive ? : | Are you sure ?
|
YES/NO (no chosen) | YES/NO
Я создал подпредставление с другим типом вопроса и контейнерное представление для встраивания пути таким образом :
Вот код моего контейнера View, белый блок встроен в Scrollview
@ObservedObject var VM:SurveyBrowserViewModel
@State private var offsetX:CGFloat = 0
@State private var opacity:Double = 1
@State var myView:AnyView = AnyView(EmptyView())
var body: some View {
ZStack{
Image("background_survey_canyon")
.resizable()
backgroundTriangle
.opacity(0.65)
ScrollView(showsIndicators:false){
myView
.padding(.top, 55 + safeAreaTop)
.padding(.bottom, 60 + safeAreaBottom)
.offset(x : offsetX , y: 0)
.opacity(opacity)
.onReceive(VM.nextQuestionPassthrough) { (v) in
self.myView = v
}
.onReceive(VM.nextQuestionValuePassthrough) { (v) in
self.offsetX = v
self.opacity = 0
withAnimation(.spring()) {
self.offsetX = 0
self.opacity = 1
}
}
}
.frame(maxWidth: .infinity,maxHeight: .infinity)
}
}
и здесь это раздел viewModel, который обновляет состояние View, текущий вопрос - это вопрос, который должен отображаться в соответствии с хорошим типом.
var nextQuestionPassthrough = PassthroughSubject<AnyView,Never>()
/// Get The good view to match the correct question tyoe
/// - Parameter answerSelected: Binding bool to hide/show next button visibility
private func getGoodView(){
guard (currentQuestion != nil) else { nextQuestionPassthrough.send(AnyView(EmptyView())); return }
switch QuestionType.intToQuestionType(value: currentQuestion!.type!){
case .YesOrNo :
if currentQuestionViewModel == nil{
currentQuestionViewModel = YesNoQuestionViewModel(question: currentQuestion!,temporaryId: temporaryId)
}
nextQuestionPassthrough.send(AnyView(YesNoQuestionView(VM: currentQuestionViewModel as! YesNoQuestionViewModel,answerSelected: nextViewState! )))
}
}
Я пробовал другой способ добиться того, чего я ожидаю:
- Мне нужна анимация, такая как автопрокрутка, идущая справа налево, но это косметика c, и это не моя главная проблема.
Моя проблема в том, что когда я отправляю представление из nextQuestionPassthth через раздел инициализации из моего нового представления вызывается, но не появляется. Таким образом, все состояния сохраняются, как мы видим на картинке (да и нет ответа - два @State установлены в false при инициализации, но остаются выбранными при отправке нового представления. Я попробовал несколько идей, например опубликованное представление вместо @State но поведение такое же.
Я думаю о новом подходе, с моим контейнером встраиваем два представления для создания хорошей анимации и хорошего жизненного цикла (затем появляется init)
Имеет Кто-нибудь когда-нибудь изучал эту проблему или делал что-то подобное?