swift - 在 SwiftUI 中检索和保存时转换 Realm 属性的值
问题描述
我有一个Flight
Realm 类,其duration
属性是Int
. 它将飞行的持续时间存储为分钟数。
class Flight: Object, ObjectKeyIdentifiable{
@objc dynamic var duration = 0
}
我将一个Flight
对象作为一个对象传递ObservedRealmObject
给一个编辑它的子视图。用户可以将时间输入为HHMM
(130 = 1 小时 30 分钟) 或#.#
(1.5 小时)。我有一些扩展可以将这些时间中的任何一个从 a 转换为String
存储为 an 的分钟数,然后再转换Int
回来。
但我遇到的问题是绑定我的TextField
. 我无法duration
直接绑定到属性,因为我需要将它从时间格式转换为分钟数。
struct MyView: View {
@ObservedRealmObject var flight: Flight
@AppStorage("timeDisplayHHMM") var timeDisplayHHMM = false
var body: some View{
TextField(timeDisplayHHMM ? "HHMM": "#.#", text: $flight.duration)
}
}
我尝试了几种不太有效的不同方法。
尝试 1
我创建了一个@State
我设置的变量,.onAppear
然后我将值保存在里面,.onChange
如下所示:
@State var duration = ""
TextField(...)
.onChange(of: duration, perform: { value in
//Save duration using my view model
model.saveDuration(flight: $flight, duration: duration)
})
.onAppear(){
//Get value
duration = flight.duration.timeDisplay //"timeDisplay" is my conversion Int extension.
}
这很好用,但它依赖于onAppear
保持其值更新。因此,如果duration
我的 Realm 中发生更改,除非用户使视图再次出现,否则 UI 将不会更新。
尝试 2
我尝试创建自定义绑定,并从 Realm 属性设置绑定的值,然后将其保存在 setter 中。这在用户键入时行为不规律,因为值在他们完成键入之前已保存和更新。
例如,如果他们输入,1.
那么它会快速将其保存为 1 小时,然后1.0
在他们完成输入之前值更新为1.5
。
private var durationBinding: Binding<String> {
Binding<String>(get: {
//Set binding value
flight.duration.timeDisplay
}, set: {
//Save
model.saveDuration(flight: $flight, duration: $0)
})
}
我怎样才能获得绑定到String
Realm 属性的好处,同时仍然将值转换为/从Int
?
解决方案
推荐阅读
- sql - 为什么表有 PK 时创建索引更快?(SQL 服务器)
- c++ - DEV C++ 第 69 行 [错误] 'i' 的名称查找已更改为 ISO 'for' 范围 [-fpermissive]
- angular - 在进行 HTTP get 调用后响应为 null,然后在 Ionic 中发出 CORB 警告
- javascript - 如何使用对象匹配设置具有相同宽度和高度的图像的背景
- python - Python,无法将我的代码转换为 while 循环
- python - 为什么在使用带有 TF 后端的 Keras 时收到太多不推荐使用的警告?
- python - 如何在“数据”处无延迟地访问网页;在 Python 中使用 Selenium Chromedriver 的页面?
- mysql - Mysql:将某些列从一行复制到另一行
- c# - 如何使用 fo-dicom 修改 Dicom 标签
- docker - 在 Alpine docker 容器中运行 geckodriver