Как заменить текущий вид в SwiftUI?

Я разрабатываю приложение на SwiftUI.

У меня есть NavigationView, и у меня есть кнопки на панели навигации. Я хочу заменить текущий вид (который является результатом выбора TabView) другим.

В основном, когда пользователь нажимает кнопку "Изменить", я хочу заменить представление другим представлением, чтобы внести изменения, и когда пользователь закончит, предыдущий вид восстанавливается путем нажатия кнопки "Готово".

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

Некоторые примеры кода, чтобы объяснить, что я ищу.

private extension ContentView {
    @ViewBuilder
    var navigationBarLeadingItems: some View {
        if tabSelection == 3 {
            Button(action: {
                print("Edit pressed")
                // Here I want to replace the tabSelection 3 view by another view temporarly and update the navigation bar items
                }) {
                    Text("Edit")
            }
        }
    }
}

struct ContentView: View {    

    var body: some View {
        NavigationView {
            TabView(selection: $tabSelection) {
                ContactPage()
                    .tabItem {
                        Text("1")
                    }
                    .tag(1)
                Text("Chats")
                    .tabItem() {
                        Text("2")
                    }
                    .tag(2)
                SettingsView()
                    .tabItem {
                        Text("3")
                    }
                    .tag(3)
            }.navigationBarItems(leading: navigationBarLeadingItems)
        }
    }
}

Спасибо

РЕДАКТИРОВАТЬ

У меня есть рабочая версия, в которой я просто обновляю переменную переключения в моем действии кнопки, которая заставляет мое представление отображать ту или иную вещь, она работает, но я не могу применить к ней какой-либо эффект анимации, и она выглядит "неправильно" в SwiftUI Думаю, есть кое-что получше, чего я не знаю.

1 ответ

Решение

Если вы просто хотите добавить анимацию, вы можете попробовать:

struct ContentView: View {
    ...
    @State var showEditView = false

    var body: some View {
        NavigationView {
            TabView(selection: $tabSelection) {
                ...
                view3
                    .tabItem {
                        Text("3")
                    }
                    .tag(3)
            }
            .navigationBarItems(leading: navigationBarLeadingItems)
        }
    }
}
private extension ContentView {
    var view3: some View {
        VStack {
            if showEditView {
                FormView()
                    .background(Color.red)
                    .transition(.slide)
            } else {
                Text("View 3")
                    .background(Color.blue)
                    .transition(.slide)
            }
        }
    }
}

struct FormView: View {
    var body: some View {
        Form {
            Text("test")
        }
    }
}

Возможной альтернативой является использование ViewRouter: какперемещаться между представлениями в SwiftUI с помощью @EnvironmentObject.

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