我想要一个每天午夜都变成 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
}
我尝试创建一个具有执行每日重置功能的类,然后创建另一个函数来返回重置布尔值,但它不会确认视图。
你的计时器没问题。
您的代码中有几个问题:
将
class Daily
代码移至顶层。这将消除 @ObservableObject
错误。
将
@State var daily
更改为 @StateObject
。这将使 @ObservableObject
正常工作。
请勿将功能
getBool()
与@State
一起使用。像 @Published var timedbool
一样直接使用 daily.timedbool
。
在 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
以避免缩进。