从 Button 按 Swift UI 显示新视图 [英] Show a new View from Button press Swift UI
问题描述
我希望能够在我的一个视图上按下按钮时显示一个新视图.
I would like to be able to show a new view when a button is pressed on one of my views.
从我看过的教程和其他已回答的问题来看,似乎每个人都在导航视图中使用导航按钮,除非我误以为导航视图是在我的应用程序顶部为我提供菜单栏右箭头的那个我不想要那个.当我将导航按钮放在不是 NavigationView 子项的视图中时,它只是在 UI 上被禁用,我无法点击它,所以我想我不能使用它.
From the tutorials I have looked at and other answered questions here it seems like everyone is using navigation button within a navigation view, unless im mistaken navigation view is the one that gives me a menu bar right arrows the top of my app so I don't want that. when I put the navigation button in my view that wasn't a child of NavigationView it was just disabled on the UI and I couldn't click it, so I guess I cant use that.
我看到的其他示例似乎使用了演示链接/按钮,它们似乎显示了一种弹出式视图.
The other examples I have seen seem to use presentation links / buttons which seem to show a sort of pop over view.
我只是在寻找如何单击常规按钮并全屏显示另一个视图,就像在旧的做事方式中执行转场一样.
Im just looking for how to click a regular button and show another a view full screen just like performing a segue used to in the old way of doing things.
推荐答案
举个简单的例子,你可以使用类似下面的内容
For simple example you can use something like below
import SwiftUI
struct ExampleFlag : View {
@State var flag = true
var body: some View {
ZStack {
if flag {
ExampleView().tapAction {
self.flag.toggle()
}
} else {
OtherExampleView().tapAction {
self.flag.toggle()
}
}
}
}
}
struct ExampleView: View {
var body: some View {
Text("some text")
}
}
struct OtherExampleView: View {
var body: some View {
Text("other text")
}
}
但是如果你想以这种方式呈现更多的视图看起来很讨厌
but if you want to present more view this way looks nasty
你可以在没有NavigationView的情况下使用堆栈来控制视图状态
You can use stack to control view state without NavigationView
例如:
class NavigationStack: BindableObject {
let didChange = PassthroughSubject<Void, Never>()
var list: [AuthState] = []
public func push(state: AuthState) {
list.append(state)
didChange.send()
}
public func pop() {
list.removeLast()
didChange.send()
}
}
enum AuthState {
case mainScreenState
case userNameScreen
case logginScreen
case emailScreen
case passwordScreen
}
struct NavigationRoot : View {
@EnvironmentObject var state: NavigationStack
@State private var aligment = Alignment.leading
fileprivate func CurrentView() -> some View {
switch state.list.last {
case .mainScreenState:
return AnyView(GalleryState())
case .none:
return AnyView(LoginScreen().environmentObject(state))
default:
return AnyView(AuthenticationView().environmentObject(state))
}
}
var body: some View {
GeometryReader { geometry in
self.CurrentView()
.background(Image("background")
.animation(.fluidSpring())
.edgesIgnoringSafeArea(.all)
.frame(width: geometry.size.width, height: geometry.size.height,
alignment: self.aligment))
.edgesIgnoringSafeArea(.all)
.onAppear {
withAnimation() {
switch self.state.list.last {
case .none:
self.aligment = Alignment.leading
case .passwordScreen:
self.aligment = Alignment.trailing
default:
self.aligment = Alignment.center
}
}
}
}
.background(Color.black)
}
}
struct ExampleOfAddingNewView: View {
@EnvironmentObject var state: NavigationStack
var body: some View {
VStack {
Button(action:{ self.state.push(state: .emailScreen) }){
Text("Tap me")
}
}
}
}
struct ExampleOfRemovingView: View {
@EnvironmentObject var state: NavigationStack
var body: some View {
VStack {
Button(action:{ self.state.pop() }){
Text("Tap me")
}
}
}
}
我认为这种方式很糟糕,但 SwiftUI 中的导航更糟糕
In my opinion this bad way, but navigation in SwiftUI much worse
这篇关于从 Button 按 Swift UI 显示新视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!