[英]How to avoid initializing a struct when using NavigationLink
每次我使用 NavigationLink 时,目标参数都需要初始化结构的对象,从而产生不必要且混乱的代码。
//View which will send me to another view using NavigationLink()
struct ProfileConfiguration: View {
NavigationLink(destination: ConfigurationCardView(person: Person.init(name: "",
bio: "",
location: ""))
)
}
//The destination view, which has the struct Person:
struct ConfigurationCardView: View {
var person: Person
var body: some View {
//Content
}
}
//The struct Person, with some variables:
struct Person: Hashable, Identifiable {
var name: String
var personImages: [UIImage?] = []
var bio: String
var location: String
}
您可以注入将传递给NavigationLink
的ViewBuilder
,而不是在父视图中硬编码目的地,例如:
struct ProfileConfiguration<CardView: View>: View {
let cardViewBuilder: () -> CardView
init(@ViewBuilder cardViewBuilder: @escaping () -> CardView) {
self.cardViewBuilder = cardViewBuilder
}
var body: some View {
NavigationLink(destination: cardViewBuilder, label: {})
}
}
这不是必须的,有些视图需要这些参数来显示相关数据。
但是,如果您愿意,可以将该参数设为可选或提供默认值,这样您就不必传递它了
有两种方法可以实现这一目标。
1 告诉 swift 对象可以保存由 ? 定义的 nil 值 (变种人:人?)
2 在 ConfigurationCardView 中为 person 对象分配一些值,所以 swift 不会要求传递 person 对象。
struct ConfigurationCardView: View {
var person: Person = Person.init(name: "",bio: "",location: "")
var body: some View {
//Content
}
}
在 1 种方法中,它仍然允许(非强制性)您从创建 NavigationLink 的外部传递人员对象。
在 2 种方法中,如果您使用 var 定义人员,它仍然允许(非强制性)您从创建 NavigationLink 的外部传递人员对象。 但是如果你用 let 定义,它将不允许你从外部传递 person 对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.