繁体   English   中英

SwiftUI 如果按下按钮后满足条件,如何在某处创建视图链接,否则保持在同一个视图中?

[英]SwiftUI how to make a view link somewhere if a condition is met after a button press, otherwise stay in the same view?

所以我有这个代码:

import SwiftUI
struct LoginView: View {
    
    
    
    @ObservedObject var vm : PlayerViewModel
    @State private var username = ""
    private var searchAllowed : Bool{
        if(username.count>2)
        {
            return false
        }
        return true
    }
    
    
    var body: some View {
        NavigationView{
            ZStack{
                VStack{
                    Text("Enter your Username:")
                        
                    
                    
                    TextField("Username", text: $username)
                       
                    Button{
                        Task{
                            if let uuid = await vm.getUUID(username: username)
                            {
                                await vm.getPlayer(uuid: uuid)
                                print(vm.state)
                            }
                        }
                    } label:
                    {
                        LabelView()
                                
                                
                    }
                    }
                  
                    
            }
                switch vm.state{
                case .loading:
                    LoadingView()
                default:
                    EmptyView()
                }
            }
        
        }
    }
    
}

现在,在按钮任务中,我调用了两个异步函数并获取了一些数据,现在我想要做的是如果我得到的数据是好的(对我来说,我在我的 ViewModel 中定义了一个枚举,在这种情况下,如果它是 vm.state.success)我想被发送到另一个视图,如 NavigationLink 会这样做,否则我只想留在同一个视图中,也许只是显示一些文本视图或其他东西。 但我真的不知道我将如何实现这样的事情,我已经做了一段时间的研究。

如果它成功了,我真的希望它就像搜索按钮只是一个导航视图,并且它可以将我发送到某个地方,并且可以使用后退箭头将我发送回原始视图。 但如果发生其他任何事情,我想留在这个原始视图中,只显示一些文本。 有谁知道我怎么能做这样的事情? 我一直在考虑这个问题,但想不出解决方案,我需要按下按钮,在加载 api 调用时显示加载视图,如果数据很好,我想要那个按钮表现得好像它是一个新视图的导航链接,否则如果不是,我想留在同一个视图中,也许只是添加一个警报。 这在 SwiftUI 中是否可行?

只需使用

public init(isActive: Binding<Bool>, @ViewBuilder destination: () -> Destination, @ViewBuilder label: () -> Label) NavigationLink的初始化程序

这是使用示例:

import SwiftUI
struct LoginView: View {
        
    @ObservedObject var vm : PlayerViewModel
    @State private var username = ""
    @State private var navigateToView = false
            
    var body: some View {
        NavigationView {
            ZStack {
                VStack {
                    Text("Enter your Username:")
                    
                    TextField("Username", text: $username)
                    
                    Button {
                        Task {
                            if let uuid = await vm.getUUID(username: username) {
                                await vm.getPlayer(uuid: uuid)
                                
                                DispatchQueue.main.async {
                                    navigateToView = true
                                }
                            }
                        }
                    } label: {
                        LabelView()
                    }
                }
                
                NavigationLink(isActive: $navigateToView, destination: { DestinationView() }, label: { EmptyView() })
            }
        }
    }
}

struct DestinationView: View {
    var body: some View {
        Text("You have successfully logged in!")
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM