簡體   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