繁体   English   中英

使用 NavigationLink 时如何避免初始化结构

[英]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
}

您可以注入将传递给NavigationLinkViewBuilder ,而不是在父视图中硬编码目的地,例如:

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.

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