如何初始化SwiftUI DatePicker.hourAndMinute元素



我正在尝试初始化这个"WakeUpDate";date元素,以便默认显示值为上午10:00。此日期选择器仅为HourandMinute,并存储在用户默认值中。

我尝试初始化date元素,但它没有构建。出现此错误:Cannot assign value of type 'State<Date>' to type 'Published<Date>'

UserData:当前,以下init不构建

import Foundation
import SwiftUI
class UserData: ObservableObject {
init() {
_wakeUpTime = State<Date>(initialValue: Calendar.current.date(DateComponents(Hour: 10)) ?? Date())
}

@Published var wakeUpTime: Date = UserDefaults.standard.object(forKey: "wakeUpTime") as? Date ?? Date() {
didSet {
UserDefaults.standard.set(self.wakeUpTime, forKey: "wakeUpTime")
}
}
}

设置详细信息:选择日期选择器的位置:

struct SettingsDetailView: View {
@ObservedObject var userData: UserData
var body: some View {
Form{

DatePicker("Select a new time", selection: $userData.wakeUpTime, displayedComponents: .hourAndMinute)
}
}
}

主设置:显示所选DatePicker日期的位置:

import SwiftUI
import UserNotifications
struct SettingsView: View {
@ObservedObject var userData = UserData()

static var dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "hh:mm a"
return formatter
}()
var body: some View {

NavigationView {
VStack (alignment: .center, spacing: 0) {
Form{
Section(header: Text("NOTIFICATION SETTINGS")) {
HStack {
Text("Current Notification Time")
.foregroundColor(Color("MainText"))

Spacer()

Text("(self.userData.wakeUpTime, formatter: SettingsView.self.dateFormatter)")
}
}
}
}
}
}
}

EDIT我尝试过这样初始化UserData,但现在当我用日期选择器选择一个新时间并退出应用程序时,新时间不见了,5PM(初始化时间(再次显示。

import Foundation
import SwiftUI
class UserData: ObservableObject {
init() {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat =  "HH:mm"
if let date = dateFormatter.date(from:"17:00") {
wakeUpTime = date
}
}

@Published var wakeUpTime: Date = UserDefaults.standard.object(forKey: "wakeUpTime") as? Date ?? Date() {
didSet {
UserDefaults.standard.set(self.wakeUpTime, forKey: "wakeUpTime")
}
}
}

如何只在第一次启动时运行init,并在用日期选择器选择了所选时间后被删除?

我这样做就明白了:

class UserData: ObservableObject {

@AppStorage("userdatahaslaunched") var userdatahaslaunched = false
init() {

if !userdatahaslaunched {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat =  "HH:mm"
if let date = dateFormatter.date(from:"10:00") {
wakeUpTime = date
}
userdatahaslaunched = true
}

}

如果您的意图是让用户初始化一个唤醒时间,那么您应该始终期待一个日期。因此,您正在寻找的是日历方法nextDate(after:),您可以匹配所需的组件(小时和分钟(。请注意,如果minutes为零,则在调用此方法时不需要包含minutes组件。

let date = Calendar.current.nextDate(after: Date(), matching: .init(hour: 10), matchingPolicy: .strict)!
print(date.description(with: .current))

最新更新