ios - SwiftUI - 更改 @Published 结构时是否可以触发 didSet?

标签 ios swift swiftui swift5 observableobject

我刚刚更新到 XCode 11.4,我的一些代码已经停止工作。我有一些 @Published ObservableObject 中的结构变量.以前,当我更新结构的属性时,didSet方法会在发布的属性上触发,但情况不再如此。这种行为是否有可能在 Swift 的最新更新中被设计改变了?

这是一个简单的例子:


import SwiftUI

struct PaddingRect {
  var left: CGFloat = 20
  var right: CGFloat = 20
}

final class SomeStore : ObservableObject {
  @Published var someOtherValue: String = "Waiting for didSet"

  @Published var paddingRect:PaddingRect = PaddingRect() {
    didSet {
      someOtherValue = "didSet fired"
    }
  }
}

struct ObserverIssue: View {
  @ObservedObject var store = SomeStore()

  var body: some View {
    VStack {
      Spacer()

      Rectangle()
        .fill(Color.yellow)
        .padding(.leading, store.paddingRect.left)
        .padding(.trailing, store.paddingRect.right)
        .frame(height: 100)

      Text(store.someOtherValue)

      HStack {
        Button(action: {
          // This doesn't call didSet
          self.store.paddingRect.left += 20

          // This does call didSet, ie. setting the whole thing
//          self.store.paddingRect = PaddingRect(
//            left: self.store.paddingRect.left + 20,
//            right: self.store.paddingRect.right
//          )

        }) {
          Text("Padding left +20")
        }

        Button(action: {
          self.store.paddingRect.right += 20
        }) {
          Text("Padding right +20")
        }
      }

      Spacer()
    }
  }
}

struct ObserverIssue_Previews: PreviewProvider {
    static var previews: some View {
        ObserverIssue()
    }
}


属性更新,但 didSet不开火。

是否可以获得结构的嵌套属性来触发 didSet发布者的方法?

最佳答案

您可以订阅@Published类本身的值(value)流。

final class SomeStore: ObservableObject {
    @Published var someOtherValue: String = "Waiting for didSet"
    @Published var paddingRect: PaddingRect = PaddingRect()
    private var subscribers: Set<AnyCancellable> = []
    
    init() {
        $paddingRect.sink { paddingRect in
            print(paddingRect) // 🎉
        }.store(in: &subscribers)
    }
}

Note that the sink closure will be called on willSet, though.

关于ios - SwiftUI - 更改 @Published 结构时是否可以触发 didSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60932494/

相关文章:

ios - 如何从 UIDocumentMenuViewController 或 UIDocumentPickerViewController 获取文件的来源?

json - 如何使用 Alamofire 用 JSON 数据填充我的对象数组

ios - 如何获取总已使用内存

swiftui - 不同尺寸的 SF 符号图像

swift - 无法将类型 'Int' 的值转换为预期的参数类型 'Angle' 。 Xcode 11、Mac 10.15、SwiftUI

swift - 在 NavigationLink 内环绕 View 会覆盖 View 中文本的文本对齐方式以居中

ios - dequeueReusableHeaderFooterViewWithIdentifier 为单元格返回 nil,但 dequeueReusableCellWithIdentifier 不是

iphone - 像 Instagram 一样的照片效果

ios - UITableViewCell 的子类不显示文本

ios - 为 iOS 构建 webrtc 库时出错