我無法弄清楚為什么視圖沒有更新,請幫忙。在實際專案中,我通過 websocket 獲取資料(并使用 設定變數DispatchQueue.main.async {})。下面以代碼為例。單擊按鈕后,視圖沒有任何反應。我使用 ObservableObject,Published 屬性。有什么問題?
附言。它需要在帖子中添加更多文本,因為它主要是代碼,但我不知道要添加什么,一切都在下面:)
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()
}
}
uj5u.com熱心網友回復:
試試這個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)
}
}
}
}
uj5u.com熱心網友回復:
只需將模型作為值型別(即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()
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/491679.html
