如何在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中,我想还​​有一些我不知道的更好的东西。

解决方法

如果您只想添加动画,则可以尝试:

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 How To Navigate Between Views In SwiftUI By Using An @EnvironmentObject

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...