【发布时间】:2020-11-12 11:21:06
【问题描述】:
在下面的代码中,作为填字游戏应用程序的一部分,我创建了一个 Grid,其中包含 squares、一个 Squares 的 @Published 数组和一个要显示的 GridView Grid 的一个实例,griddy。当我在 GridView 中更改 griddy 的方块时,GridView 会按预期重新创建,并且我看到一个“!”而不是“A”。
现在我又添加了一个级别——拼图包含一个@Published Grid,griddy。因此,在 PuzzleView 中,我使用了uzzle.griddy。但是,这不起作用。字母没有改变,PuzzleView 主体中的断点永远不会被击中。
为什么?我正在开发一个我真正需要这 3 种不同结构的应用程序。
import SwiftUI
class Square : ObservableObject {
@Published var letter: String
init(letter: String){
self.letter = letter
}
}
class Grid : ObservableObject {
@Published var squares:[[Square]] = [
[Square(letter: "A"), Square(letter: "B"), Square(letter: "C")],
[Square(letter: "D"), Square(letter: "E"), Square(letter: "F"), ]
]
}
class Puzzle: ObservableObject {
@Published var griddy: Grid = Grid()
}
struct GridView: View {
@EnvironmentObject var griddy: Grid
var body: some View {
VStack {
Text("\(griddy.squares[0][0].letter)")
Button("Change Numbers"){
griddy.squares[0][0] = Square(letter:"!")
}
}
}
}
struct PuzzleView: View {
@EnvironmentObject var puzzle: Puzzle
var body: some View {
VStack {
Text("\(puzzle.griddy.squares[0][0].letter)")
Button("Change Numbers"){
puzzle.griddy.squares[0][0] = Square(letter:"!")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
// PuzzleView().environmentObject(Puzzle())
GridView().environmentObject(Grid())
}
}
【问题讨论】:
-
这是一个略有不同的问题,但我的答案与那里相同:stackoverflow.com/a/62988407/968155。最简单的解决方案是将
Square设为值类型:struct Square { var letter: String }(不需要@Published或ObservableObject) -
我需要 Square 成为一个 ObservableObject——它在 SquareView 中被观察——所以我需要它成为一个类。但感谢您的回复和想法。
-
要被“观察”,它不需要是
ObservableObject- 有一些范例,比如Bindings在视图之间传递值。如果它有自己的生命周期事件(例如,值根据一些外部触发器更新),那么它成为一个可观察的对象是有意义的。无论如何,另一个答案告诉您如何处理ObservableObjects(那里提到的最后一种方法)
标签: swiftui publishing