【发布时间】:2021-07-18 16:19:53
【问题描述】:
本质上,我是通过创建一个简单的应用来学习的,该应用采用 ISBN 并返回图书信息。我创建了一个视图文件来显示此信息以及用于捕获 ISBN 的文本条目。与从 Internet 获取信息有关的逻辑方面很好,但是,当我尝试使用修改后的变量更新视图时,它只会按照声明的方式打印它们,而不是在修改后重新绘制它们。任何意见,将不胜感激。谢谢!
这个具体的例子默认引用@Published var test = "Testing 1 2 3,搜索后var修改为test = modified text,然后打印到TestView.swift的文本视图中。 print 语句正确显示修改后的文本,但它不会在传递它的视图中更新。目标是通过最终字典,但出于测试目的,我使用了一个简单的字符串变量。
TestFile.swift
import Foundation
import SwiftyXMLParser
import SwiftUI
class getdata: ObservableObject {
@Published var outputDict: [String:String] = [:]
@Published var test = "Testing 1 2 3"
.
.
//code to grab xml from url
.
.
func parseData(input: String) {
var title: String?
var author: String?
let xml = try! XML.parse(input)
if let text = xml["GoodreadsResponse", "book", "title"].text {
title = text
outputDict["title"] = title
}
if let text = xml["GoodreadsResponse", "book", "authors", "author", "name"].text {
author = text
outputDict["author"] = author
}
print("Title: \(outputDict["title"]!), Author: \(outputDict["author"]!)")
test = "modified text"
print(test)
}
}
TestView.swift
import SwiftUI
struct testView: View {
@State var textEntry: String = ""
@ObservedObject var viewModel: getdata
var body: some View {
let try1 = getdata()
VStack {
TextField("Enter ISBN", text: $textEntry)
.padding()
Button(action: {try1.getData(bookID: textEntry)}, label: {
Text("Search")
})
Text("Title: \(self.viewModel.test)")
}
}
}
struct testView_Previews: PreviewProvider {
static var previews: some View {
testView(viewModel: getdata())
}
}
【问题讨论】:
-
让自己的生活更简单。类名是 CamelCased,所以你的数据类应该是
GetData。try1.getData(bookID: textEntry)是什么?我很惊讶你的代码可以编译。
标签: swift swiftui observedobject