【问题标题】:How to pass Binding of @published variable in function from ObservedObject如何从 ObservedObject 传递函数中 @published 变量的绑定
【发布时间】:2022-01-21 16:55:31
【问题描述】:

我想将@Published 变量的绑定从我的ObservableObject 传递给一个结构,以便可以在闭包内更改它的值。我不能让它工作。下面是我的代码的简化版本:

final class OnboardingStateController: ObservableObject {
  @Published var shouldHide: Bool = false

  func go() {
    MyLogic.fooBar(
      shouldHide: shouldHide // error appears here Cannot convert value of type 'Bool' to expected argument type 'Binding<Bool>'
    )
  }
}

struct MyLogic {
  static func fooBar(shouldHide: Binding<Bool>) {
    ... SomeClass({ shouldHide.wrappedValue = true })
  }
}

我该怎么做?

【问题讨论】:

    标签: ios swiftui


    【解决方案1】:

    这是一个替代方案,Binding 需要一个 SwiftUI View 来保持更新,因为它符合 DynamicProperty 规范

    import SwiftUI
    
    struct OnboardingStateView: View {
        @StateObject var vm: OnboardingStateController = OnboardingStateController()
        var body: some View {
            VStack{
                Button("go", action: {
                    vm.go()
                })
                Text(vm.shouldHide.description)
            }
        }
    }
    final class OnboardingStateController: ObservableObject {
        @Published var shouldHide: Bool = false
        
        func go() {
            //This uses a completion handler vs passing the `Binding`
            MyLogic.fooBar(
                shouldHide: { shouldHide in
                    self.shouldHide = shouldHide
                }
            )
        }
    }
    
    struct MyLogic {
        static func fooBar(shouldHide: (Bool) -> Void) {
            let value = Bool.random() //.. SomeClass({ shouldHide.wrappedValue = true })
            shouldHide(value)
        }
    }
    
    struct OnboardingStateView_Previews: PreviewProvider {
        static var previews: some View {
            OnboardingStateView()
        }
    }
    

    【讨论】:

      【解决方案2】:

      目前还不清楚你为什么需要Binding,但如果那里仍然需要它,那么你可以即时生成它,比如

        func go() {
          MyLogic.fooBar(
            shouldHide: Binding(get: { self.shouldHide }, set: { self.shouldHide = $0 })
          )
        }
      

      注意:这是一个简化的变体,其中self被捕获,如果你需要避免它,那么你可以考虑在每个闭包中使用[weak self]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 2020-12-04
        • 1970-01-01
        • 2012-10-17
        • 1970-01-01
        相关资源
        最近更新 更多