swiftUI:更新视图



我不知道为什么视图不更新,请帮助。在实际项目中,我通过websocket获得数据(并与DispatchQueue.main.async {}设置变量)。下面是代码示例。点击按钮后,视图没有任何变化。我使用ObservableObject, Published属性。有什么问题吗?

p。它需要添加一些更多的文本到帖子,因为它主要是代码,但我不知道该添加什么,一切都在下面:)

import SwiftUI
class DataBase: ObservableObject {

@Published var data: [MyData]
@Published var users: [User]

init(data: [MyData], users: [User]) {
self.data = data
self.users = users
}
}
class MyData: ObservableObject, Identifiable {

@Published var type: String
@Published var array: [Double]

init(type: String, array: [Double]) {
self.type = type
self.array = array
}
}
class User: ObservableObject, Identifiable {

@Published var id: UUID = UUID()
@Published var name: String
@Published var data: MyData

init(name: String, data: MyData) {
self.name = name
self.data = data
}
}
let data: [MyData] = [
MyData(type: "type1", array: [1, 2, 3]),
MyData(type: "type2", array: [4, 5, 6, 7]),
]
let users: [User] = [
User(name: "Tim", data: data[0]),
User(name: "Steve", data: data[1]),
]
struct ContentView: View {

let db = DataBase(data: data, users: users)

var body: some View {
ShowView(db: db)
}
}
struct ShowView: View {

@ObservedObject var db: DataBase

var body: some View {

HStack {

List(db.users) { user in
Text("(user.name) (user.data.type)")
Text("(user.data.array.count)")
Divider()
}

List(db.data) { data in
Text("(data.type)")
Text("(data.array.count)")
Divider()
}
}

HStack {
Button("add data to data[0]") {
db.data[0].array.append(db.data[0].array.last! + 10)
print(db.data[0].array)
}

Button("add data to data[1]") {
db.data[1].array.append(db.data[1].array.last! + 20)
print(db.data[1].array)
}
}

}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

尝试使用objectWillChange,为我工作:

struct ShowView: View {

@ObservedObject var db: DataBase

var body: some View {

HStack {

List(db.users) { user in
Text("(user.name) (user.data.type)")
Text("(user.data.array.count)")
Divider()
}

List(db.data) { data in
Text("(data.type)")
Text("(data.array.count)")
Divider()
}
}

HStack {
Button("add data to data[0]") {
db.objectWillChange.send()  // <-- here
db.data[0].array.append(db.data[0].array.last! + 10)
print(db.data[0].array)
}

Button("add data to data[1]") {
db.objectWillChange.send()  // <-- here
db.data[1].array.append(db.data[1].array.last! + 20)
print(db.data[1].array)
}
}

}
}

只需将模型设置为值类型(即struct而不是class) -无需再更改:

struct MyData: Identifiable {
var id = UUID()
var type: String
var array: [Double]
init(type: String, array: [Double]) {
self.type = type
self.array = array
}
}
struct User: Identifiable {
var id: UUID = UUID()
var name: String
var data: MyData
init(name: String, data: MyData) {
self.name = name
self.data = data
}
}

在Xcode 13.4/iOS 15.5上测试

更新然后需要用ObservedObject为每个可观察模型对象创建分离视图,如

List(db.users) {
UserRowView(user: $0)
}
struct UserRowView: View {
@ObservedObject var user: User  // a class, so needed to be observed
var body: some View {
Text("(user.name) (user.data.type)")
Text("(user.data.array.count)")
Divider()
}
}

MyData相同,或者进行依赖项更新,如

class User: ObservableObject {
@Published var data: MyData
// ...
private var cancellable: AnyCancellable?
init(...) {
// ....
cancellable = data.objectWillChange.sink { [weak self] _ in
guard let self = self else { return }
self.objectWillChange.send()
}
}
}

最新更新