簡體   English   中英

SwiftUI:如何在 SwiftUI 視圖中取消計時器?

[英]SwiftUI: How to cancel timer in SwiftUI view?

我在 SwiftUI 視圖中使用計時器,如下面的代碼所示。 它按預期工作,但在某些情況下我想取消/停止該計時器。 timer var 上似乎沒有“.cancel”屬性或方法。 如何取消此計時器? 有什么想法/提示嗎?


import SwiftUI

struct ContentView: View {

    @State private var selection = 2

    @State private var rotation: Double = GBstrtest

    let timer = Timer.publish (every: 0.8, on: .current, in: .common).autoconnect()

    var body: some View {
        TabView(selection: $selection){
            Text("Settings")
                .font(.title)
                .tabItem {
                    VStack {
                        Image(systemName: "gear")
                        .font(Font.system(.title ))
                        Text("Settings")
                    }
                }
                .tag(0)
            VStack {
                Divider().padding(2)
                ZStack {
                    Image("image1")
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                    Image("image2")
                        .resizable()
                        .aspectRatio(contentMode:.fit)
                        .rotationEffect(.degrees(rotation))
                        .animation(.easeInOut(duration: 0.3) )
                        .padding(EdgeInsets(top: 0, leading: 50, bottom: 0, trailing: 50))
              }
              Spacer()
            }
            .tabItem {
                VStack {
                    Image(systemName: "speedometer")
                        .font(Font.system(.title ))
                    Text("Read Meter")
                }
            }
            .tag(1)
        }
        .onReceive(timer) {
            _ in self.rotation = Double.random(in: 0 ... 200)
            // How do I cancel timer HERE!?
        }
    }
}

在條件語句中,使用以下代碼:

self.timer.upstream.connect().cancel()

完整的循環是這樣的:

struct MySwiftUIView : View {
...

@State var timer = Timer.publish (every: 1, on: .current, in: .common).autoconnect()
@State var timeRemaining = -1

var body: some View {
    ZStack {
       // Underlying shapes etc as needed

       Text("\(timeRemaining)").
           .opacity(timeRemaining > 0 ? 1 : 0)
           .onReceive(timer) { _ in
                if self.timeRemaining < 0 {
                    // We don't need it when we start off
                    self.timer.upstream.connect().cancel()
                    return
                }
                if self.timeRemaining > 0 {
                    self.timeRemaining -= 1
                } else {
                    self.timer.upstream.connect().cancel()
                    // Do the action on end of timer. Text would have been hidden by now
                }
          }
          .onTapGesture {  // Or any other event handler that should start countdown
                self.timeRemaining = Int(delayValue)
                self.timer = Timer.publish (every: 1, on: .current, in: 
                                                   .common).autoconnect()
          }
    }

瞧,一個可重復使用的計時器,想用多少次就用多少次!

暫無
暫無

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

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