swift - 如何在 SwiftUI 中的 Preview 提供程序中初始化数据
问题描述
我正在尝试从本地主机获取数据,使用列表视图制作帖子列表并将数据传递给 CustomDetailView。这是我的 NetworkManager 代码:
那么我必须将什么传递给 StoryDetails_Preview?
这是 StoryDetails 代码
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]()
)
)
}
}
解决方案
您好,首先我需要查看StoryDetails()
但如果 StoryDetails 是一个故事,它应该在里面声明,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
推荐阅读
- python - 如何通过 Python 在命令行应用程序中运行代码
- c# - 数学函数 - 绘图问题
- sql-server - Express 上的链接服务器和升级到 SQL Server 2014 Standard
- css - 有没有办法将唯一的 scss 文件导出到模块化 css 文件?
- google-cloud-platform - 从 Dataprep 导出结果配置文件
- python - 命令“python setup.py egg_info”失败,错误代码为 1 | 无法通过 python 和 pycharm 安装
- snakemake - Can snakemake create job error and output files automatically on a SLURM cluster?
- deployment - 如何将一个应用同时部署到 Kubernetes 上的多台机器上?
- oracle - 为经典报告添加自定义搜索
- gradle - 如何在 Kotlin DSL 中读取虚线 Gradle 属性?