如何在 SwiftUI 中的预览提供程序中初始化数据

Ulu*_*kov 1 xcode swift swiftui

我正在尝试从本地主机获取数据,使用列表视图制作帖子列表并将数据传递给 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]()
             )
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

错误: 在此处输入图片说明

fak*_*iho 5

嗨,首先我需要看到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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

struct ContentView: View {

    @ObservedObject var networkManager = NetworkManager()
    var body: some View {
        VStack {
            DetailsView(user: networkManager.user)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

详细信息视图结构保存用户变量:

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")")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

模型:

struct User: Decodable {
    var userId: Int = 0
    var id: Int = 0
    var title: String = ""
    var completed: Bool = false
}
Run Code Online (Sandbox Code Playgroud)

PS:当然,您可以比这种方式更好地解包以提供任何零异常,它只是 POC