Dynami c просмотр с swiftUI - PullRequest
       51

Dynami c просмотр с swiftUI

0 голосов
/ 28 января 2020

Я пытаюсь создать динамический c вид, чтобы ответить на некоторые вопросы. Эти вопросы создаются из моего бэк-офиса, и следующий вопрос зависит от ответа текущего пользователя. Поэтому я должен строить свою точку зрения по мере прогресса.

Вот пример:

Первый вопрос:

Are you alive ? :  |      Are you sure ?
                   |
YES/NO (no chosen) |        YES/NO

Я создал подпредставление с другим типом вопроса и контейнерное представление для встраивания пути таким образом :

enter image description here

Вот код моего контейнера 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)

Имеет Кто-нибудь когда-нибудь изучал эту проблему или делал что-то подобное?

...