我在将 UIKit 架构模式转换为 SwiftUI 时遇到问题。我目前的模式主要是带有协调器/路由器的 MVVM。添加@ObservableObject/@Published 后,MVVM 部分看起来非常简单和自然。但是协调/路由似乎不直观。视图和协调(导航)功能在 SwiftUI 中紧密耦合。似乎不可能将它们与使用 helper struct 分开AnyView。
这是一个示例:我想在 SwiftUI 中创建一个可重用的行/单元格。假设生产中的这一行非常复杂,因此我想重用它。我也想把它放在另一个模块中,这样我就可以在多个目标中重用它。(如 iOS、macCatalyst 等...)
现在我想控制当用户点击该视图或该视图中的按钮时会发生什么。根据上下文,我需要导航到不同的目的地。据我所知,可能的 NavigationLink 目标要么硬连线到视图中,要么AnyView传递到视图中。
这里有一些示例代码。此单元格/行包含两个按钮。我想导航到其他一些取决于上下文的视图,而不是硬连接到代码中:
struct ProductFamilyRow: View {
@State private var selection: Int? = 0
let item: ProductFamilyItem
let destinationView1: AnyView
let destinationView2: AnyView
var body: some View {
VStack {
NavigationLink(
destination: destinationView1,
tag: 1,
selection: self.$selection
) {
EmptyView()
}
NavigationLink(
destination: destinationView2,
tag: 2,
selection: self.$selection
) {
EmptyView()
}
HStack {
Text(item.title) …Run Code Online (Sandbox Code Playgroud) 我在不按 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 …Run Code Online (Sandbox Code Playgroud) 我正在尝试从登录视图推送到详细信息视图,但无法做到这一点。即使导航栏也未显示在登录视图中。如何在swiftUI中按下按钮单击?如何在单击按钮时使用导航链接?
var body: some View {
NavigationView {
VStack(alignment: .leading) {
Text("Let's get you signed in.")
.bold()
.font(.system(size: 40))
.multilineTextAlignment(.leading)
.frame(width: 300, height: 100, alignment: .topLeading)
.padding(Edge.Set.bottom, 50)
Text("Email address:")
.font(.headline)
TextField("Email", text: $email)
.frame(height:44)
.accentColor(Color.white)
.background(Color(UIColor.darkGray))
.cornerRadius(4.0)
Text("Password:")
.font(.headline)
SecureField("Password", text: $password)
.frame(height:44)
.accentColor(Color.white)
.background(Color(UIColor.darkGray))
.cornerRadius(4.0)
Button(action: {
print("login tapped")
}) {
HStack {
Spacer()
Text("Login").foregroundColor(Color.white).bold()
Spacer()
}
}
.accentColor(Color.black)
.padding()
.background(Color(UIColor.darkGray))
.cornerRadius(4.0)
.padding(Edge.Set.vertical, 20)
}
.padding(.horizontal,30)
}
.navigationBarTitle(Text("Login"))
}
Run Code Online (Sandbox Code Playgroud)