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。它们是独立的对象。