簡體   English   中英

使用 SwiftUI 從結構中的完成變量調用方法

[英]Call a method from a completion variable in a struct with SwiftUI

我正在使用 SwiftUI。 我有一個具有完成的viewModel的全局變量。 我正在嘗試找到一種方法來調用此 class 中的方法來進行操作。

struct ContentView: View {

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

我試過讓它可選然后在init中設置它但仍然得到這個錯誤:

Escaping 閉包捕獲變異的“自我”參數

我希望你能幫忙。

您會收到錯誤消息,因為您嘗試從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
            }
        }
    }
}

這是可能的方法。

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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM