繁体   English   中英

计时器结束时如何切换视图 SwiftUI

[英]How do I switch views when the timer ends SwiftUI

我有两种看法。 主视图和中断视图。 我有一个计时器在主视图中运行,它倒数到零。 当计时器归零时,我希望能够将屏幕切换到 Break View。 我正在使用 MVVM 来跟踪计时器。 使用.onReceive 使它看起来像计时器在后台运行。

我尝试使用 boolean 来检查计时器是否已达到零,并基于此更改了视图,但它不起作用并且给出了一个错误,说明视图的结果未在任何地方使用。 如果有任何帮助,我在内容视图中有一个导航视图。

提前致谢。

代码片段:

主视图:

struct MainView: View {

    var body: some View {
       
                VStack(alignment: .center, spacing: 50, content: {

                        Button(action: {
                            if !fbManager.isTimerStarted {
                                fbManager.start()
                                fbManager.isTimerStarted = true
                            }
                            else {
                                 fbManager.pause()
                                 fbManager.isTimerStarted = false
                            }
                            
                        }, label: {
                            Image(systemName: fbManager.isTimerStarted == true ? "pause.fill" : "play.fill")
                                .resizable()
                                .scaledToFit()
                                .frame(width: 50, height: 50)
                                .foregroundColor(Color(red: 1.00, green: 1.00, blue: 1.00))
                        })
                        .onReceive(NotificationCenter.default.publisher(
                            for: UIScene.didEnterBackgroundNotification)) { _ in
                                if fbManager.isTimerStarted {
                                    movingToBackground()
                                }
                                
                        }
                            .onReceive(NotificationCenter.default.publisher(
                                for: UIScene.willEnterForegroundNotification)) { _ in
                                    
                                    if fbManager.isTimerStarted {
                                        movingToForeground()
                                    }
                                    
                                }
                })
        }
    }
    
    func movingToBackground() {
        print("Moving to the background")
        notificationDate = Date()
        fbManager.pause()
    }
    
    func movingToForeground() {
        
        print("Moving to the foreground")
        
        let deltaTime: Int = Int(Date().timeIntervalSince(notificationDate))
        fbManager.secondsElapsed -= deltaTime
        fbManager.start()
    }
    
}

查看 Model:

class FocusBreakManager: ObservableObject {
  
    var timer: Timer = Timer()

    func start() {
        
        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [self] _ in
            
            self.secondsElapsed -= 1
            self.focusfill += 0.01667
            focusTime = String(secondsElapsed)
            focusTime = formatCounter()
            
            if secondsElapsed <= 0 {
                
                stop()

            }

        }
    }
 
    func formatCounter() -> String {
        
        let minutes = Int(secondsElapsed) / 60 % 60
        let seconds = Int(secondsElapsed) % 60
        return String(format : "%02i : %02i", minutes, seconds)
    }
    
}

嘿,为了跟上您的解决方案,这里是一个示例,说明您需要使用@ObservedObject属性包装器才能从您的视图中监视更新。

struct ContentView: View {

    @ObservedObject private var focusBreakManager = FocusBreakManager()

    var body: some View {
        VStack {
            Text("\(focusBreakManager.elapsedSeconds)")
            Text(focusBreakManager.timerRunningMessage)
            Button("Start timer", action: focusBreakManager.start)
        }
        .padding()
    }
}

class FocusBreakManager: ObservableObject {

    var timer: Timer = Timer()
    @Published var elapsedSeconds = 0

    var timerRunningMessage: String {
        timerRunning
        ? "Timer is running"
        : "Timer paused"
    }

    private var timerRunning: Bool {
        timer.isValid
    }

    func start() {
        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in
            guard let self else { return }
            self.elapsedSeconds += 1
            if self.elapsedSeconds > 5 {
                self.timer.invalidate()
            }
        }
    }

}

您还可以查看自动连接 api 这是一个很棒的教程: https://www.hackingwithswift.com/books/ios-swiftui/triggering-events-repeatedly-using-a-timer

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM