swiftui - 在初始化期间确定 NavigationLink 目标
问题描述
我正在尝试根据提供给视图的通用数据NavigationLink
动态确定 SwiftUI的目的地。init()
根据下面的代码,如果Item
a 是 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
另一种类型,但没有成功。
解决方案
这是一个简单的演示来解决您的问题。只需将 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")
}
}
推荐阅读
- reactjs - 在循环的每次迭代中更新 useState 变量后,React 子组件不会重新渲染
- linq - LINQ to SQL - 无法翻译空值的表达式检查
- python - 格式化列表中的特定元素
- azure-cognitive-search - Azure 认知搜索:搜索包含“-”的数据
- r - 跨行应用两个样本比例测试
- sharepoint - Graph API 403 Forbidden - 令牌中需要存在 scp 或角色声明
- apache-flink - Flink - 具有高并行度的网络缓冲区数量不足
- c# - 文本的重叠部分变得透明 GDI+
- rabbitmq - rabbitMq中的事件交换规则
- angular - Angular Reactive Forms:如何显示错误+红色边框?