首页 > 解决方案 > type() 不能符合 View;只有结构/枚举/类类型可以符合协议

问题描述

我正在关注本教程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 类型可以符合协议

标签: swiftswiftui

解决方案


navigate,如所写,想要接受一个论点,但您同时发送 anHStack和 a VStack

@ViewBuilder可以为你解决这个问题,它是一个注解(在 SwiftUI 中经常使用,尤其是在内置组件中),它让视图拥有/返回多个根级元素:

static func navigate<T: View>(_ route: Router, @ViewBuilder content: () -> T) -> AnyView {

推荐阅读