【问题标题】:Call a method from a completion variable in a struct with SwiftUI使用 SwiftUI 从结构中的完成变量调用方法
【发布时间】:2020-06-21 20:51:00
【问题描述】:

我正在使用 SwiftUI。我有一个 viewModel 的全局变量,它有一个完成。我正在尝试找到一种方法来调用此类中的方法来为操作添加香味。

struct ContentView: View {

let viewModel = TimerViewModel(totalTime: 15, finished: {
    print("I need it to call a method here")
})

我试过让它可选然后在 init 中设置它但仍然得到这个错误:

转义闭包捕获变异的“自我”参数

希望你能帮忙。

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    您收到错误消息,因为您尝试从 TimerViewModel 内部修改 ContentView

    调用完成方法的替代方法是在TimerViewModel 中创建@Published 属性:

    class TimerViewModel: ObservableObject {
        @Published var finished = false // it can be Bool or anything you want to pass to your View
    
        func end() {
            finished = true
        }
    }
    

    并在View中捕获它的变化:

    struct ContentView: View {
        @ObservedObject var viewModel = TimerViewModel()
        
        var body: some View {
            VStack {
                Text("Text")
            }
            .onReceive(viewModel.$finished) { finished in
                if finished {
                    // timer has finished, you can call some method now
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      这是可能的方法。

      struct ContentView: View {
          var viewModel: TimerViewModel? = nil   // needs to be initialized
      
          init() {
              // assign function directly instead of via capturing closure
              viewModel = TimerViewModel(totalTime: 15, finished: timerCallback)
          }
      
          var body: some View {
              Text("Demo")
          }
      
          private func timerCallback() {
              // do anything needed here
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-26
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        • 2019-12-23
        相关资源
        最近更新 更多