首页 > 解决方案 > 在初始化期间确定 NavigationLink 目标

问题描述

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

根据下面的代码,如果Itema 是 a Tour,则目标应该是 a TourDetailView,否则是 a 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<Item: CardItem, T: View>: View {

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

我怎样才能达到我想要的?我尝试制作destination另一种类型,但没有成功。

标签: swiftuiswiftui-navigationlink

解决方案


这是一个简单的演示来解决您的问题。只需将 View 存储在 type 的属性中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")
    }
}

推荐阅读