![](/img/trans.png)
[英]How to reuse view in NavigationView when using with 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
按鈕時,它都會切換ContentView
的settingView
變量的值並根據其值切換視圖。
試試下面的代碼。
內容視圖:
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.