【问题标题】:SwiftUI - Why won't my @Published variable update within my @ObservedObject call?SwiftUI - 为什么我的@Published 变量不会在我的@ObservedObject 调用中更新?
【发布时间】: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,所以你的数据类应该是GetDatatry1.getData(bookID: textEntry) 是什么?我很惊讶你的代码可以编译。

标签: swift swiftui observedobject


【解决方案1】:

虽然我认为您的示例无法编译,并且您没有提供某些函数的定义,但我可以指出一个错误:

在视图主体中,您正在创建一个新的 Observable 对象:

let try1 = getdata()

您的 Button 会在此调用消息:

Button(action: {try1.getData(bookID: textEntry)}...

但是您的 TextView 从原始 viewModel 读取:

Text("Title: \(self.viewModel.test)")

您正在与try1 交互,但从viewModel 获取您的视图。它们是独立的对象。

【讨论】:

  • 谢谢!这是我的一个愚蠢的错误。 “try1”来自访问另一个 swift 文件方法的较早尝试。一旦我学会了如何使用和实现@Published,我就撤销了它,但从未在代码中改变它。我很惊讶它现在也编译了,因为我意识到了错误!但它现在按预期工作。
猜你喜欢
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2019-12-18
  • 1970-01-01
  • 2021-09-23
  • 2023-03-19
相关资源
最近更新 更多