SwiftUI - 为什么我的@Published 变量不会在我的@ObservedObject 调用中更新?
SwiftUI - Why won't my @Published variable update within my @ObservedObject call?
本质上,我是通过创建一个简单的应用程序来学习的,该应用程序采用 ISBN 和 returns 图书信息。我创建了一个视图文件来显示此信息以及用于捕获 ISBN 的文本条目。关于从互联网获取信息的逻辑方面很好,但是,当我尝试使用修改后的变量更新视图时,它只按声明打印它们,而不是在修改后重绘它们。任何意见,将不胜感激。谢谢!
这个具体的例子引用了@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())
}
}
尽管我认为您的示例无法编译,并且您没有提供某些函数的定义,但我可以指出一个错误:
在视图主体中,您正在创建一个新的 Observable 对象:
let try1 = getdata()
并且您的 Button 在此调用消息:
Button(action: {try1.getData(bookID: textEntry)}...
但是您的 TextView 从原始 viewModel 中读取:
Text("Title: \(self.viewModel.test)")
您正在与 try1
互动,但您的观点来自 viewModel
。它们是独立的对象。
本质上,我是通过创建一个简单的应用程序来学习的,该应用程序采用 ISBN 和 returns 图书信息。我创建了一个视图文件来显示此信息以及用于捕获 ISBN 的文本条目。关于从互联网获取信息的逻辑方面很好,但是,当我尝试使用修改后的变量更新视图时,它只按声明打印它们,而不是在修改后重绘它们。任何意见,将不胜感激。谢谢!
这个具体的例子引用了@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())
}
}
尽管我认为您的示例无法编译,并且您没有提供某些函数的定义,但我可以指出一个错误:
在视图主体中,您正在创建一个新的 Observable 对象:
let try1 = getdata()
并且您的 Button 在此调用消息:
Button(action: {try1.getData(bookID: textEntry)}...
但是您的 TextView 从原始 viewModel 中读取:
Text("Title: \(self.viewModel.test)")
您正在与 try1
互动,但您的观点来自 viewModel
。它们是独立的对象。