【发布时间】:2021-01-29 08:16:10
【问题描述】:
我有一个导航视图(SettingsView),如下所示。当我第一次去 PayScheduleForm 时,来自 UserDefaults 的日期被正确传递。如果我更改 PayScheduleForm 中的 payDate 值,我可以看到它正确更新了 UserDefaults 键。但是,如果我返回 SettingsView,然后再次转到 PayScheduleForm,原始值仍会显示在选取器中。
这是一个奇怪的场景,所以最好逐步解释:
- 启动应用程序
- 转到设置 -> 支付时间表
- 最后一个 UserDefaults payDate 值在 DatePicker (10/08/2020) 中
- 将值更改为 10/14/2020 - 控制台显示 UserDefaults.standard.object(forKey: "payDate") = 10/14/2020 字符串
- 返回设置(使用返回按钮)
- 返回 Pay Schedule 并查看 DatePicker 具有其原始值 (10/08/2020)
- 当然,如果我再次重新启动应用程序,我会在 DatePicker 中看到 10/14/2020
struct SettingsView: View {
var body: some View {
NavigationView{
if #available(iOS 14.0, *) {
List{
NavigationLink(destination: AccountsList()) {
Text("Accounts")
}
NavigationLink(destination: CategoriesList()) {
Text("Categories")
}
NavigationLink(destination: PayScheduleForm(date: getPayDate()).onAppear(){
getPayDate()
}) {
Text("Pay Schedule")
}
}.navigationTitle("Settings")
} else {
// Fallback on earlier versions
}
}.onAppear(perform: {
getUserDefaults()
})
}
func getPayDate() -> Date{
var date = Date()
if UserDefaults.standard.object(forKey: "payDate") != nil {
date = UserDefaults.standard.object(forKey: "payDate") as! Date
}
let df = DateFormatter()
df.dateFormat = "MM/dd/yyyy"
print(df.string(from: date))
return date
}
struct PayScheduleForm: View {
var frequencies = ["Bi-Weekly"]
@Environment(\.managedObjectContext) var context
@State var payFrequency: String?
@State var date: Date
var nextPayDay: String{
let nextPaydate = (Calendar.current.date(byAdding: .day, value: 14, to: date ))
return Utils.dateFormatterMed.string(from: nextPaydate ?? Date() )
}
var body: some View {
Form{
Picker(selection: $payFrequency, label: Text("Pay Frequency")) {
if #available(iOS 14.0, *) {
ForEach(0 ..< frequencies.count) {
Text(self.frequencies[$0]).tag(payFrequency)
}.onChange(of: payFrequency, perform: { value in
UserDefaults.standard.set(payFrequency, forKey:"payFrequency")
print(UserDefaults.standard.string(forKey:"payFrequency")!)
})
} else {
// Fallback on earlier versions
}
}
if #available(iOS 14.0, *) {
DatePicker(selection: $date, displayedComponents: .date) {
Text("Last Payday")
}
.onChange(of: date, perform: { value in
UserDefaults.standard.set(date, forKey: "payDate")
let date = UserDefaults.standard.object(forKey: "payDate") as! Date
let df = DateFormatter()
df.dateFormat = "MM/dd/yyyy"
print(df.string(from: date))
})
} else {
// Fallback on earlier versions
}
}
```
【问题讨论】: