如何使用Button(action:{}){}以编程方式转到swiftUI中的另一个视图?

时间:2019-12-11 19:19:00

标签: macos button swiftui

我正在尝试以编程方式更改我的macOS应用程序中的视图。一世 找到了NavigationLink等其他内容,但我不允许使用它们。切换的代码必须在Button的操作中,因为这样,我知道即使代码不是按钮格式,也可以快速从代码中切换。我该怎么办?

ContentView.swift中的按钮:

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

Settings.swift:

import SwiftUI

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

没有NavigationLink,没有NavigationView或其他任何内容。我正在寻找一种纯粹在按钮操作范围内执行此操作的方法。

我对此主题还有另一个问题,因此,如果您知道swiftui,请单击here,对我来说至关重要的是回答它。如果您回答了这个问题,也许您可​​以回答另一个问题,并且如果该问题得到了可接受的答案,那么它将被点亮。

4 个答案:

答案 0 :(得分:2)

这里是一个例子:

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

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)
                }
            }
        }
    }
}

我希望这会有所帮助!

答案 1 :(得分:1)

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

此处HomeView包含Setting button,并具有一个@Binding变量来处理对ContentView的按钮单击。

因此,每当您点击Setting上的HomeView按钮时,它将切换 settingView的{​​{1}}变量,并根据其值切换视图。

尝试下面的代码。

ContentView:

ContentView

HomeView:

struct ContentView: View {
    @State var settingView = false

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

答案 2 :(得分:0)

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

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
  }
}

答案 3 :(得分:0)

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) { }
}