如何在 SwiftUI 中以编程方式切换到另一个视图(无需按下按钮)

ami*_*n89 5 xcode swift swiftui

我在不按 SwiftUI 应用程序中的按钮的情况下切换到另一个视图时遇到问题。我可以举很多我想做的例子: 1-想象一个登录表单,我们需要填写 2 个文本字段:用户名和密码。当出现完美匹配时,我们会自动进行身份验证。2-现在就以我的例子为例。我有这样的看法:

在此输入图像描述

我想要做什么:当我在列表中选择一行(例如 Lyon-Perrache TGV)并且如果两个文本字段不为空 => 我将被重定向到另一个视图。

有很多示例可以了解如何从另一个视图移动到一个视图,但总是单击按钮..(使用 NavigationLink)我需要在两个文本字段被填充时以及当我从列表中选择目标文本字段时以编程方式执行此操作。

这是我的代码的一部分:

import SwiftUI



struct Search: View {



 @ObservedObject var webservice = Webservice()

 @State var Depart: String = ""

 @State var Destination: String = ""

 @State var listStation = [Station]()

 @State var predictedValues: Array<String> = []

 @State var isBeingEditedDeparture: Bool = false

 @State var isBeingEditedDestination: Bool = false

 @State var hey: Bool  = false

 @State var activate: Bool  = false



init() {

      UITableView.appearance().showsVerticalScrollIndicator = false

      UITableView.appearance().backgroundColor = .clear

      UITableViewCell.appearance().backgroundColor = .clear

      //UITableView.appearance().separatorColor = .clear

  }



var body: some View {





    VStack(alignment: .leading){



        PredictingTextField(listStation: self.$listStation , predictedValues: self.$predictedValues, 
        Depart: self.$Depart, Destination: self.$Destination, isBeingEditedDeparture: 
        self.$isBeingEditedDeparture, isBeingEditedDestination: self.$isBeingEditedDestination )



            .textFieldStyle(RoundedBorderTextFieldStyle())



        List() {

            ForEach(self.predictedValues, id: \.self){ value in



                Text(value)

                    .onTapGesture {

                        if(self.isBeingEditedDeparture == true)

                        {

                            self.Depart = value

                        }

                        else{

                            self.Destination = value
                            self.activate = true

                        }

                }

            }

        }.padding(.top, 10)



    }

}
Run Code Online (Sandbox Code Playgroud)

我已声明一个名为“activate”的变量作为移动到新视图的触发点。当我们在“目标”文本字段列表中选择一行时,它等于 true。

我怎样才能走得更远?

先感谢您 !

错误

paw*_*222 9

iOS 16+

注意:下面是如何以编程方式呈现新链接的简化示例。有关更高级的通用示例,请参阅此答案

在 iOS 16 中,我们可以访问NavigationStackNavigationPath,它们允许我们以编程方式推送视图。

struct ContentView: View {
    @State private var path = NavigationPath()

    var body: some View {
        NavigationStack(path: $path) {
            Text("ContentView")
                .navigationDestination(for: String.self) { view in
                    if view == "NewView" {
                        Text("NewView")
                    }
                }
        }
        .onAppear {
            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                path.append("NewView")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,您NewView只需从任何位置执行即可触发 出现path.append("NewView")

iOS 13-15

您可以将 aNavigationLinkisActive参数一起使用。当您设置此参数时,true它将显示NewView

@State var activated: Bool = false
Run Code Online (Sandbox Code Playgroud)
NavigationLink(destination: NewView(), isActive: $activated) {
    EmptyView()
}
Run Code Online (Sandbox Code Playgroud)

然后你需要将你的放入NavigationLink其中NavigationView才能使其工作。