0

我有这堂课:

class MyObject:ObservableObject, Hashable {
  static func == (lhs: PageView, rhs: PageView) -> Bool {
    lhs.id == rhs.id
  }
  
  func hash(into hasher: inout Hasher) {
    hasher.combine(id)
  }
  
  @Published var visible:Bool
  @Published var myObject:MyObject
  
  let id = UUID()
  init(_ myObject:MyObject) {
    self.myObject = myObject
    self.isVisible = false
  }
}

和这个模型

class MyModel:ObservableObject {
  @Published var myObjects = [MyObject]()
  ...
}

稍后在应用程序中我有这个:

  @ObservedObject private var myModel:MyModel
  
  
  init(_ myModel:MyModel) {
    self.myModel = myModel
  }

  ScrollView(.vertical, showsIndicators: false) {
    ForEach(model.myObjects, id: \.self) { object in
      MyPanel(object)
        .opacity(object.isVisible ? 1 : 0.6)
        .allowsHitTesting(object.isVisible)
    }
  }

对象最初看起来是半透明的。我更改了isVisible一个对象的属性,它在滚动视图上继续透明。

我该如何解决?

4

1 回答 1

3

MyModelmyObjects仅在更改数组属性时才会发布更改。从MyModel的角度来看,它有一个对象引用数组。如果您更改其中一个对象的属性,则没有任何更改,它仍然具有相同对象引用的相同数组。

MyObject是一个可观察的对象,但没有任何东西在观察它。

您应该将MyPanel要传递的对象作为可观察对象保存,并让它设置自己的不透明度和命中测试,而不是在滚动视图级别完成。这样只有叶子视图会重新渲染,而不是整个滚动视图。

于 2021-07-23T11:00:58.397 回答