如何每天午夜重置 Bool 值 SwiftUI XCode

问题描述 投票:0回答:1

我想要一个每天午夜都变成 true 的 Bool 值,有谁知道我如何实现这一点。这是我迄今为止尝试过的代码。我不断收到错误“类型 '()' 无法符合 'View'”和“通用结构 'ObservedObject' 要求 'ContentView.Daily' 符合 'ObservableObject'”

导入 SwiftUI 进口粉底

结构ContentView:视图{

class Daily: ObservableObject {
    @Published var timedbool: Bool = false
    private var timer: Timer?
    
    init(){
        scheduleDailyReset()
    }
    private func scheduleDailyReset(){
        let calendar = Calendar.current
        if let tomorrow = calendar.date(byAdding: .day, value: 1, to: calendar.startOfDay(for: Date())) {
            let timeInterval = tomorrow.timeIntervalSinceNow
            timer = Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: #selector(setBool), userInfo: nil, repeats: false)
    }
}
    
    @objc func setBool() {
        timedbool = true
        scheduleDailyReset()
    }
    func getBool() -> Bool {
        return timedbool
    }
    }

@State var daily = Daily()
@State var dailyreset: Bool = daily.getBool()

var body: some View {
    NavigationView {
        VStack{
            if dailyreset{
                navig2 = true
            }

我尝试创建一个具有执行每日重置功能的类,然后创建另一个函数来返回重置布尔值,但它不会确认视图。

swift xcode swiftui view foundation
1个回答
0
投票

你的计时器没问题。

您的代码中有几个问题:

  1. class Daily
    代码移至顶层。这将消除
    @ObservableObject
    错误。

  2. @State var daily
    更改为
    @StateObject
    。这将使
    @ObservableObject
    正常工作。

  3. 请勿将功能

    getBool()
    @State
    一起使用。像
    @Published var timedbool
    一样直接使用
    daily.timedbool

  4. 在 body

    navig2 = true
    行中,您将返回一个 Bool,而您应该返回一个 View。您需要在此处放置视图。

这些将是我对其进行的更改:

import SwiftUI

class Daily: ObservableObject {
    @Published var timedbool: Bool = false
    private var timer: Timer?
    
    init() {
        scheduleDailyReset()
    }
    private func scheduleDailyReset() {
        let calendar = Calendar.current
        guard let tomorrow = calendar.date(byAdding: .day, value: 1, to: calendar.startOfDay(for: .now)) else {
//        guard let tomorrow = calendar.date(byAdding: .second, value: 5, to: .now) else { // use this instead to test
            print("There's no tomorrow.")
            return
        }
        
        let timeInterval = tomorrow.timeIntervalSinceNow
        timer = Timer.scheduledTimer(timeInterval: timeInterval, target: self, selector: #selector(setBool), userInfo: nil, repeats: false)
        print("timer: \(timer?.fireDate)")
    }
    
    @objc func setBool() {
        timedbool = true
        scheduleDailyReset()
    }
}

struct ContentView: View {
    @StateObject var daily = Daily()
    
    var body: some View {
        VStack {
            Button("Confirm") {
                daily.timedbool = false  // set @Published var
            }
            .disabled(!daily.timedbool) // use @Published var
        }
        .padding()
        .onChange(of: daily.timedbool) { bool in // use @Published var
            print("timed bool set to \(bool)")
        }
    }
}

请注意,带有按钮的视图只是如何在视图中获取和设置

timedbool
的示例。

我更愿意在此处使用

Date
语句打开可选的
guard
以避免缩进。

© www.soinside.com 2019 - 2024. All rights reserved.