次のコードでは、監視対象のオブジェクトが更新されますが、それを監視するビューは更新されません。理由はありますか?
コードは、画面に 10 個の数字 (0..<10) とボタンを表示します。ボタンが押されるたびに、10 個の数字の 1 つがランダムに選択され、その可視性が反転します (可視→非表示、またはその逆)。
print ステートメントは、ボタンが数値を更新していることを示していますが、ビューはそれに応じて更新されません。配列の値を更新しても配列の値自体は変更されないことがわかっているので、手動objectWillChange.send()
呼び出しを使用します。それが更新をトリガーするはずだと思っていたでしょうが、画面は決して変わりません。
何か案が?NumberLine
クラスまたは構造体として使用するか、NumberLine
型をまったく使用せず、代わりに構造体内で配列変数を使用するソリューションに興味がありますContentView
。
コードは次のとおりです。
import SwiftUI
struct ContentView: View {
@ObservedObject var numberLine = NumberLine()
var body: some View {
VStack {
HStack {
ForEach(0 ..< numberLine.visible.count) { number in
if self.numberLine.visible[number] {
Text(String(number)).font(.title).padding(5)
}
}
}.padding()
Button(action: {
let index = Int.random(in: 0 ..< self.numberLine.visible.count)
self.numberLine.objectWillChange.send()
self.numberLine.visible[index].toggle()
print("\(index) now \(self.numberLine.visible[index] ? "shown" : "hidden")")
}) {
Text("Change")
}.padding()
}
}
}
class NumberLine: ObservableObject {
var visible: [Bool] = Array(repeatElement(true, count: 10))
}