【问题标题】:Determine NavigationLink Destination During Initialization在初始化期间确定 NavigationLink 目标
【发布时间】:2021-09-12 22:51:00
【问题描述】:

我正在尝试根据提供给视图的通用数据在 init() 内动态确定 SwiftUI 的 NavigationLink 的目的地。

根据下面的代码,如果ItemTour,则目标应为TourDetailView,否则为LocationDetailView

struct CardView<Item: CardItem>: View {
  let card: Item
  private let destination: T
  
  init(card: Item) {
    self.card = card

    if Item.self == Tour.self {
      destination = TourDetailView(tour: card as! Tour) as! T
    } else {
      destination = LocationDetailView(location: card as! Location) as! T
    }
  }
  
  var body: some View {
    NavigationLink(destination: destination) {
      ...
    }
  }
}

现在代码没有编译,因为T 没有定义。如果我将T 定义为:

struct CardView&lt;Item: CardItem, T: View&gt;: View {

CardView 已处理,但随后我必须编辑调用 CardView 的视图,这都会引入不必要的复杂性,最终我必须在 @main 中定义 T,这是不允许的。

我怎样才能实现我想要的?我试图让destination 成为另一种类型,但没有成功。

【问题讨论】:

  • 这个话题应该很有帮助stackoverflow.com/questions/61304700/….
  • 接受的答案解决了 ym 问题。实际上,我在自己之前尝试过AnyView,但试图远离它以获得更优雅的解决方案。你的建议可能对我有帮助。谢谢。 @Asperi

标签: swiftui swiftui-navigationlink


【解决方案1】:

这是一个简单的演示来解决您的问题。只需将 View 存储在类型为 AnyView 的属性中。

struct ContentView: View {
    let destination: AnyView

    init() {
      // This is just demo purpose, here comes your condition
      if false {
        destination = AnyView(DetailViewA())
      } else {
        destination = AnyView(DetailViewB())
      }
    }

    var body: some View {
        NavigationView {
            NavigationLink(
                destination: destination,
                label: {
                    Text("Navigate")
                })
        }
    }
}

struct DetailViewA: View {
    var body: some View {
        Text("A")
    }
}

struct DetailViewB: View {
    var body: some View {
        Text("B")
    }
}

【讨论】:

  • 我应该在我的问题中提到这一点。我之前实际上尝试过AnyView。我想远离它,因为我失去了一些类型安全,但我想没有别的办法。欣赏它! @davidev
猜你喜欢
  • 2017-01-20
  • 2014-04-01
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2018-06-10
  • 2019-11-19
相关资源
最近更新 更多