首页 > 解决方案 > 如何在 SwiftUI 中的 Preview 提供程序中初始化数据

问题描述

我正在尝试从本地主机获取数据,使用列表视图制作帖子列表并将数据传递给 CustomDetailView。这是我的 NetworkManager 代码: 在此处输入图像描述

我的列表视图: 在此处输入图像描述

和 StoryDe​​tails 视图: 在此处输入图像描述

那么我必须将什么传递给 StoryDe​​tails_Preview?

这是 StoryDe​​tails 代码

import SwiftUI

struct StoryDetails: View {
    var story: Story
    var body: some View {
        VStack(alignment: .leading) {
            HStack {
                Text("story #123456")
                    .font(.callout)
                    .foregroundColor(Color.gray)
                Spacer()
                Text("5 days ago")
                    .font(.callout)
                    .foregroundColor(Color.gray)
                Button(action:{
                    print("Hello there")
                }){
                    Image(systemName:"info.circle").resizable()
                        .frame(width:22.0, height:22.0)
                        .accentColor(Color.gray)
                }
            }
            Text(story.body)
                .foregroundColor(.black)
                .kerning(1)
                .lineLimit(nil)
            HStack {
                Button(action: {
                    print("Hello World")
                }){
                    HStack {
                        Image(systemName:"heart")
                            .accentColor(.black)
                        Text("233")
                            .foregroundColor(.black)
                    }
                    .padding(.trailing)
                    HStack {
                        Image(systemName:"bubble.left")
                            .accentColor(.black)
                        Text("45")
                            .foregroundColor(.black)
                    }
                }
            }
        }
    }   
}

struct StoryDetails_Previews: PreviewProvider {
    static var previews: some View {
        StoryDetails(
            story: Story(
                id: 1,
                author: 1,
                body: "Testing",
                edited_time: "September 2019",
                pub_date: "October 2018",
                comments: [Comment](),
                story_likes: [StoryLike]()
             )
        )
    }
}

错误: 在此处输入图像描述

标签: swiftxcodeswiftui

解决方案


您好,首先我需要查看StoryDetails()但如果 StoryDe​​tails 是一个故事,它应该在里面声明,var story: Story让我在示例代码中解释更多:在这里您可以看到我的网络管理器类:

class NetworkManager: ObservableObject {
    let url: String = "https://jsonplaceholder.typicode.com/todos/1"
    var objectWillChange = PassthroughSubject<NetworkManager, Never>()

    init() {
        fetchData()
    }

    @Published var user: User? {
        didSet {
            objectWillChange.send(self)
            print("set user")
        }
    }
    func fetchData() {
        guard let url = URL(string: url) else {return}
        print("fetch data")
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard error == nil else {return}
            print("no error")
            guard let data = data else {return}
            print("data is valid")
            let user = try! JSONDecoder().decode(User.self, from: data)
            DispatchQueue.main.async {
                self.user = user
            }
        }.resume()
    }
}

这是我在其中初始化网络管理器的内容视图:

struct ContentView: View {

    @ObservedObject var networkManager = NetworkManager()
    var body: some View {
        VStack {
            DetailsView(user: networkManager.user)
        }
    }
}

详细信息视图结构包含用户变量:

struct DetailsView: View {
    var user: User?
    var body: some View {
        VStack {
            Text("id: \(user?.id ?? 0)")
            Text("UserID: \(user?.userId ?? 0 )")
            Text("title: \(user?.title ?? "Empty")")
        }
    }
}

这就是 DetailsView,你可以在这个结构中看到我声明了一个 User 类型的用户对象需要传递它,所以如果我想在 PreviewProvider 中显示它,它就像下面的代码

struct DetailsView_Previews: PreviewProvider {
    static var previews: some View {
        DetailsView(user: User(id: 0, userId: 0, title: "hello", completed: false)
    }
}

模型:

struct User: Decodable {
    var userId: Int = 0
    var id: Int = 0
    var title: String = ""
    var completed: Bool = false
}

PS:当然,您可以比这种方式更好地展开以提供任何 nil 异常,这只是 POC


推荐阅读