从一个 SwiftUI 视图移动到另一个

Posted

技术标签:

【中文标题】从一个 SwiftUI 视图移动到另一个【英文标题】:Moving from one SwiftIUI view to another 【发布时间】:2021-01-23 18:42:14 【问题描述】:

我是应用程序开发的新手,我正在构建一个需要跨不同视图移动的应用程序。

目前,我正在使用 NavigationView/链接设置,但这意味着每次我将 NavigationView 放置在具有 NavigationView 的不同视图中时,视图的大小会变小,并且我会留下多个返回按钮.

有没有办法避免这种情况(在不使用导航系统的情况下更改 SwiftUI 中的视图的不同方法?)

【问题讨论】:

您需要发布代码。没有它,没有人可以明确诊断问题。请查看How to create a Minimal, Reproducible Example,以便从您的问题中获得最大收益。 【参考方案1】:

您应该在您的应用程序中只使用一个NavigationView。例如,在应用的主屏幕上?

NavigationLink 将您的用户引导至一个不应具有NavigationView 视图的新视图。添加两个 NavigationViews 并将它们链接在一起将导致您描述的行为,即通过将一个 NavigationView 推入另一个缩小内部所有其他视图(和它们自身)。

尝试将所有 NavigationView 组件从除主视图/根视图之外的所有其他视图中移除。

例如:

struct ROOT_VIEW: View 
    var body: some View 
        NavigationView 
            VStack 
                NavigationLink(destination: SECONDVIEW()) 
                    Text("Show Detail View")
                .navigationBarTitle("ROOT VIEW")
            
        
    

链接到第二个视图(所有其他视图):

struct SECOND_VIEW: View 
    var body: some View 
            VStack 
                Text("This is the second view")
                .navigationBarTitle("ROOT VIEW", display: .inline)
            
        
    

只有将.navigationBarTitle("ROOT VIEW", display: .inline) 添加到您的第二个视图才能让标题出现在顶部(带有一个后退按钮)。您还可以在每个标题栏内添加按钮:

.navigationBarItems(leading:
       // FAR LEFT SIDE OF THE TITLE BAR
        HStack 
            Button(action: // action goes here) 
                Image(systemName: "plus")
                    .font(.largeTitle)
            .foregroundColor(.pink)
        , trailing:
       // FAR RIGHT SIDE OF THE TITLE BAR
        HStack 
            Button(action:  //action goes here) 
                Image(systemName: "plus")
                    .font(.largeTitle)
            .foregroundColor(.blue)
        )

另一种选择:

您无需使用NavigationViews,即可在您的应用之间引导用户。你可以使用简单的Boolean states

例如,假设您有一个根视图屏幕,屏幕上有三个按钮,一个用于登录,一个用于注册,一个用于重置密码,每个按钮都有自己的视图。您只会根据布尔值显示一个视图:

struct ROOT_VIEW: View 

    @State var showLogin = true // This will be the default view that gets showed as its default to true
    @State var showRegister = false
    @State var showPasswordReset = false


    var body: some View 
        VStack
            if showLogin
                LoginView(showLogin: $showLogin, showRegister: $showRegister)
            
            if showRegister
                RegisterView()
            
            if showPasswordReset
                PasswordResetView()
            
        
    



struct LoginView: View 

    @Binding var showLogin: Bool
    @Binding var showRegister: Bool


    var body: some View 
        VStack
            Button(action: 
                // Change two bool values to switch to register view (turning off login view and turning on reigster view)
                showLogin.toggle()
                showRegister.toggle()
            ) 
                Text("Show Register")
            .foregroundColor(.pink)
        
    

您可以对您希望用户访问的所有视图执行此操作(显然)。假设您只希望RegisterView 只能转到LoginView,反之亦然,您只需在根视图中为RegisterView 提供showLoginshowRegister 绑定布尔值如图:

RegisterView(showLogin: $showLogin, showRegister: $showRegister)

确保在您的寄存器视图中,您不使用普通的@State,而是使用@Binding 来跨视图同步所有布尔值。

【讨论】:

谢谢,但我使用导航视图从主屏幕 (contentview) 转到登录页面,效果很好。但我还需要从登录页面更改为不同的视图,然后从该视图更改为另一个...如果有不同的方式来更改视图,我不会有问题。 让我在不使用 NavigationViews 的情况下为您添加另一个选项。 我在一个新项目中进行了尝试,它看起来很棒,但是在底部的 LogInView 预览部分中,我收到一条错误消息“缺少参数 'showLogin'、'showRegister' 在调用中的参数” . 感谢您迄今为止的帮助! 因为您需要使用默认值提供预览值(只是显示您可以看到预览)

以上是关于从一个 SwiftUI 视图移动到另一个的主要内容,如果未能解决你的问题,请参考以下文章

从一个 SwiftUI 视图移动到另一个

如何通过单击按钮在 Swift UI 中从一个视图导航到另一个视图

如何通过使用 swift 5 的动态集合视图从一个视图控制器移动到另一个视图控制器?

如何使用 swift 在情节提要中从一个视图控制器移动到另一个视图控制器 [重复]

在 Swift 中从相机中裁剪图像而不移动到另一个 ViewController

如何在 SwiftUI 中将数据从视图传递到另一个视图?