![](/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.