gpt4 book ai didi

SwiftUI 组合 : Nested Observed-Objects

转载 作者:行者123 更新时间:2023-12-04 15:01:34 25 4
gpt4 key购买 nike

让 swiftUI 仍然基于嵌套的观察对象更新的最佳方法是什么?
以下示例显示了我对嵌套观察对象的含义。 ball manager 的 balls 数组是一个已发布的属性,它包含一个可观察对象的数组,每个对象都有一个已发布的属性本身(颜色字符串)。
不幸的是,当点击其中一个球时,它不会更新球名称,也不会收到更新。所以我可能搞砸了在那种情况下如何结合工作?

import SwiftUI

class Ball: Identifiable, ObservableObject {
let id: UUID
@Published var color: String
init(ofColor color: String) {
self.id = UUID()
self.color = color
}
}

class BallManager: ObservableObject {
@Published var balls: [Ball]
init() {
self.balls = []
}
}

struct Arena: View {
@StateObject var bm = BallManager()

var body: some View {
VStack(spacing: 20) {
ForEach(bm.balls) { ball in
Text(ball.color)
.onTapGesture {
changeBall(ball)
}
}
}
.onAppear(perform: createBalls)
.onReceive(bm.$balls, perform: {
print("ball update: \($0)")
})
}

func createBalls() {
for i in 1..<4 {
bm.balls.append(Ball(ofColor: "c\(i)"))
}
}

func changeBall(_ ball: Ball) {
ball.color = "cx"
}
}

最佳答案

您只需创建一个 BallView并观察它并从那里进行更改。你必须观察每一个ObservableObject直接地

struct Arena: View {
@StateObject var bm = BallManager()

var body: some View {
VStack(spacing: 20) {
ForEach(bm.balls) { ball in
BallView(ball: ball)
}
}
.onAppear(perform: createBalls)
.onReceive(bm.$balls, perform: {
print("ball update: \($0)")
})
}

func createBalls() {
for i in 1..<4 {
bm.balls.append(Ball(ofColor: "c\(i)"))
}
}


}
struct BallView: View {
@ObservedObject var ball: Ball

var body: some View {
Text(ball.color)
.onTapGesture {
changeBall(ball)
}
}
func changeBall(_ ball: Ball) {
ball.color = "cx"
}
}

关于SwiftUI 组合 : Nested Observed-Objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66884390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com