我正在为我的应用程序学习本教程 https://www.youtube.com/watch?v=Xd0J18isFEQ,这是一个简单的应用程序,在主屏幕上显示值列表 + 然后为每一行提供详细视图
我已经实现了一个路由器来为我的应用指定路由,如下所示:
enum Router {
case detail(Result)
}
struct Navigator {
static func navigate<T: View>(_ route: Router, content: () -> T) -> AnyView {
switch route {
case .detail(let item):
return AnyView(NavigationLink(
destination: DetailView(story: item)) {
content()
})
}
}
}
我在我的主屏幕上使用它嵌入如下:
struct Home: View {
@ObservedObject var newsfeed = Newsfeed()
@State var page: Int = 1
var body: some View {
List {
ForEach(newsfeed.data) { item in
Navigator.navigate(.detail(item)) {
HStack {
WebImage(url: URL(string: item.fields.thumbnail)!)
.resizable()
.scaledToFill()
.frame(width: 120, height: 120)
.cornerRadius(2)
}
VStack (alignment: .leading, spacing: 5) {
Text(item.fields.headline)
.font(.headline)
.fontWeight(.bold)
Text(item.fields.trailText)
.font(.caption)
}
.frame(maxHeight: 120)
}
.onAppear() {
if (newsfeed.data.last == item) {
newsfeed.loadData(pageParam: page + 1, search: nil, key: nil) { result, size in
if (result != nil) { newsfeed.data.append(contentsOf: result!) }
if (size != nil) { newsfeed.pageSize += size! }
}
self.page += 1
}
}
}
}
}
}
但是我在 Navigator.navigat 上遇到错误。类型 '()' 不能符合 View,只有 struct/enum/class 类型可以符合协议
答案 0 :(得分:2)
navigate
,正如所写的,想要接受一个参数,但你同时发送了一个 HStack
和一个 VStack
。
@ViewBuilder
可以为你解决这个问题,它是一个注解(在 SwiftUI 中经常使用,尤其是在内置组件中),它让视图具有/返回多个根级元素:
static func navigate<T: View>(_ route: Router, @ViewBuilder content: () -> T) -> AnyView {