gpt4 book ai didi

ios - SwiftUI:NavigationLink 的目标 View 的异构集合?

转载 作者:行者123 更新时间:2023-11-28 19:26:11 27 4
gpt4 key购买 nike

我正在构建不同示例的演示应用程序,我希望 Root View 是一个可以导航到不同示例 View 的 List。因此,我尝试创建一个通用的 Example 结构,它可以采用不同的目的地 View,如下所示:

struct Example<Destination: View> {
let id: UUID
let title: String
let destination: Destination

init(title: String, destination: Destination) {
self.id = UUID()
self.title = title
self.destination = destination

}
}

struct Example1View: View {
var body: some View {
Text("Example 1!")
}
}

struct Example2View: View {
var body: some View {
Text("Example 2!")
}
}

struct ContentView: View {
let examples = [
Example(title: "Example 1", destination: Example1View()),
Example(title: "Example 2", destination: Example2View())
]

var body: some View {
List(examples, id: \.id) { example in
NavigationLink(destination: example.destination) {
Text(example.title)
}
}
}
}

不幸的是,这会导致错误,因为 examples 是一个异构集合:

enter image description here

我完全理解为什么它坏了;我正在创建一个异构的示例数组,因为每个 Example 结构都有自己不同的强类型目的地。但我不知道如何实现我想要的,这是一个数组,我可以从中创建一个 List,其中有许多不同的允许目的地。

我过去遇到过这种事情,过去我通过包装我的通用类型并只暴露我需要的确切属性来绕过它(例如,如果我有一个具有标题,我会制作一个包装器结构和协议(protocol),只公开标题,然后制作一个包装器结构的数组)。但在这种情况下,NavigationLink 本身需要具有泛型类型,因此我无法以非泛型方式向它公开任何属性。

最佳答案

您可以使用类型删除包装器 AnyView。不要使 Example 通用,而是将其中的目标 View 设为 AnyView 类型,并在构造 时将 View 包装在 AnyView 中示例

例如:

struct Example {

let id: UUID
let title: String
let destination: AnyView

init(title: String, destination: AnyView) {
self.id = UUID()
self.title = title
self.destination = destination
}
}

struct Example1View: View {
var body: some View {
Text("Example 1!")
}
}

struct Example2View: View {
var body: some View {
Text("Example 2!")
}
}

struct ContentView: View {
let examples = [
Example(title: "Example 1", destination: AnyView(Example1View())),
Example(title: "Example 2", destination: AnyView(Example2View()))
]

var body: some View {
NavigationView {
List(examples, id: \.id) { example in
NavigationLink(destination: example.destination) {
Text(example.title)
}
}
}
}
}

关于ios - SwiftUI:NavigationLink 的目标 View 的异构集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57206996/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com