繁体   English   中英

如何使用 Button (action:{}) {} 以编程方式转到 swiftUI 中的另一个视图,而不是任何 NavigationLink 或其他任何东西?

[英]How do I go to another view in swiftUI programmatically using Button (action:{}) {}, and NOT any NavigationLink or whatever?

我正在尝试以编程方式更改 macOS 应用程序中的视图。 我找到了诸如 NavigationLink 之类的东西,但我不允许使用它们。 要切换的代码必须在Button的action中,因为这样我知道我可以从代码中快速切换,即使它不是按钮格式的。 我怎样才能做到这一点?

ContentView.swift 中的按钮:

Button(action: {
    //What goes here. Tried Settings(), didn't work          
}) {
    Text("Settings")
}.buttonStyle(PlainButtonStyle())

设置.swift:

import SwiftUI

struct Settings: View {
    var body: some View {
        Text("Hello, world!")
    }
}

没有 NavigationLink、没有 NavigationView 或其他什么。 我正在寻找一种纯粹在按钮操作中执行此操作的方法。

我还有一个关于这个话题的问题,所以如果你知道 swiftui,请点击这里,回答这个问题对我来说很重要。 如果您回答了这个问题,也许您可​​以回答另一个问题,如果该问题得到了可接受的答案,那么它就会亮起。

基本上,这里需要3 views来实现此功能,Main ContentView用于切换视图(HomeView 和 SettingView)。

这里HomeView包含Setting button并且有一个@Binding变量来处理ContentView上的按钮点击。

因此,每当您单击HomeView上的Setting按钮时,它都会切换ContentViewsettingView变量的值并根据其值切换视图。

试试下面的代码。

内容视图:

struct ContentView: View {
    @State var settingView = false

    var body: some View {
        VStack {
            if self.settingView {
                Settings()
            } else {
              HomeView(buttonClick: $settingView)
            }
        }
    }
}

主页视图:

struct HomeView: View {
        @Binding var buttonClick: Bool

        var body: some View {
            VStack {
                Button(action: {
                    withAnimation {
                        self.buttonClick.toggle()
                    }
                }) {
                    Text("Settings")
                }.buttonStyle(PlainButtonStyle())
            }
        }
    }

下面是一个例子:

在按钮的action块中,您不能放置view 但是你可以切换一个bool ,它是一个@State变量,它更新view并在true时显示不同的视图。 我添加了一个带有.transition()的动画,但是您需要在@State变量的更改周围放置withAnimation以使其工作。

struct ContentView: View {
    @State var showView = false

    var body: some View {
        GeometryReader { proxy in
            ZStack {
                if self.showView {
                    VStack {
                        Text("Settings View")
                        Button(action: {
                            withAnimation {
                                self.showView.toggle()
                            }
                        }, label: {
                            Text("Back")
                        })
                    }
                    .frame(width: proxy.size.width, height: proxy.size.height)
                    .background(Color.red)
                    .transition(.move(edge: .trailing))
                } else {
                    VStack {
                        Text("Home View")
                        Button(action: {
                            withAnimation {
                                self.showView.toggle()
                            }
                        }, label: {
                            Text("Settings")
                        })
                    }
                    .frame(width: proxy.size.width, height: proxy.size.height)
                    .background(Color.green)
                }
            }
        }
    }
}

我希望这有帮助!

如果您在第一个视图上单击开始,它会将您导航到下一个视图。 您可以编辑第一个视图以满足您的视图要求

GloryHUbApp.swift

import SwiftUI

@main
struct GloryHubApp: App {
@State var currentStage = "OnboardingView"
var body: some Scene {
    WindowGroup {
            if(self.currentStage == "OnboardingView"){
                StartButtonView(currentStage: $currentStage)
            } else if(self.currentStage == "LoginView"){
                NextView()
            }
    }
  }
}

ButtonView.swift

import SwiftUI
struct StartButtonView: View {
// MARK: - PROPERTIES
@Binding var currentStage: String
// MARK: - BODY
var body: some View {
    Button(action: {
        //appStage = "LoginView"
        self.currentStage = "LoginView"
    }) {
        HStack (spacing: 8) {
            Text("START")
        }
    } //: BUTTO
  }
}
import SwiftUI

struct StartButtonView: View {

    @State private var isActive = false

    var body: some View {

    Button(action: {
       isActive = true
    }, label: { 
       Text("START")
    })

    NavigationLink(destination: Settings(), isActive: $isActive) { }
}
            

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM