SwiftUI Переключение между представлениями - PullRequest
2 голосов
/ 28 мая 2020

У меня есть родительское представление (Content View), содержащее массив целых чисел,

Функция переключателя представлений внутри родительского элемента переключает дочернее представление в зависимости от значения целого числа в массиве.

Проблема заключается в том, что 'view1' повторно представлен (после того, как был представлен ранее), представление не перерисовывается, а текст в текстовом поле остается заполненным.

Как я могу перерисовать каждое дочернее представление раз вызывается функция переключения?

спасибо

struct ContentView: View {

    var views =  [2,1,1]
    @State var currentView = 0

    var body: some View {

        VStack{
            viewSwitcher()
        }
    }

    func viewSwitcher() -> AnyView {
        switch views[currentView] {
        case 1:
            return AnyView(view1(currentView: self.$currentView))
        case 2:
            return AnyView(view2(currentView: self.$currentView))
        default:
            return AnyView(EmptyView())
        }
    }
}


struct view1:View {

    @State var textInput: String = ""
    @Binding var currentView: Int

    var body: some View {
        VStack{

            Text("View 1")

            TextField("Enter Text", text: self.$textInput)

            Button(action: {
                self.currentView += 1
            }){
                Text("Submit")
            }
        }
    }
}

struct view2:View {

    @Binding var currentView: Int

    var body: some View {

        VStack{
            Text("View 2")
            Button(action: {
                self.currentView += 1
            }){
                Text("Submit")
            }
        }
    }
}

1 Ответ

0 голосов
/ 28 мая 2020

Вот возможное решение. Использование модификатора .id делает представление уникальным для каждого обновления, поэтому выполняется перестройка.

Протестировано с Xcode 11.4 / iOS 13.4

func viewSwitcher() -> AnyView {
    switch views[currentView] {
    case 1:
        return AnyView(view1(currentView: self.$currentView).id(UUID()))
    case 2:
        return AnyView(view2(currentView: self.$currentView).id(UUID()))
    default:
        return AnyView(EmptyView())
    }
}
...