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

标签 swift xcode swiftui

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

enter image description here

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

有许多示例可以了解如何从另一个 View 移动到另一个 View ,但始终需要单击按钮 ..(使用 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)



    }

}

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

我怎样才能走得更远?

提前致谢!

error

最佳答案

iOS 16+

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

在 iOS 16 中我们可以访问 NavigationStackNavigationPath这使我们能够以编程方式推送 View 。

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")
            }
        }
    }
}

在上面的示例中,您可以通过从任何地方执行 path.append("NewView") 来触发 NewView 出现。

iOS 13-15

您可以使用带有 isActive 参数的 NavigationLink。当您将此参数设置为 true 时,它将显示一个 NewView:

@State var activated: Bool = false
NavigationLink(destination: NewView(), isActive: $activated) {
    EmptyView()
}

然后您需要将您的 NavigationLink 放在 NavigationView 中以使其工作。

关于swift - 如何在 SwiftUI 中以编程方式切换到另一个 View (无需按下按钮),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62348642/

相关文章:

ios - RxSwift Input Output, private subject 但在类外被触发

xcode - 如何从rootViewController中的多级导航更新detailViewController.detailItem

dictionary - 从 userInfo 字典中获取字符串

ios - 使用 alamofireimages 缓存

ios - 滚动关闭并返回 View 时 UITableViewCell 样式重置

core-data - 使用SwiftUI、Core Data、一对多关系,为什么在Many端添加一行时列表没有更新

swiftui - 如何在 SwiftUI TextField 中将光标移动到末尾?

swiftui - 在 SwiftUI 中使用 Toggle 禁用 Slider 会导致样式问题

ios - 使用带有自定义单元格和下一个按钮的 TableView 在数组中加载下一个问题

ios - Xcode:您的 session 已过期。请登录。尝试重新登录或联系苹果开发者支持以解决帐户访问问题