swift - DatePicker 在 SwiftUI 中使用时间间隔
问题描述
我想在 SwiftUI 中使用 DatePicker,它工作正常且符合预期。我想添加一个时间间隔,如解释:UIDatePicker 15 Minute Increments Swift
DatePicker("Please enter a time", selection: $wakeUp, displayedComponents: .hourAndMinute)
SwifUI 中是否有修改器?
解决方案
我不相信有一个修饰符。但是,可以通过使用 UIViewRepresentable 包装 UIDatePicker 来“自己做”:
此代码的基本结构基于与 UIKit 的接口教程。
struct MyDatePicker: UIViewRepresentable {
@Binding var selection: Date
let minuteInterval: Int
let displayedComponents: DatePickerComponents
func makeCoordinator() -> Coordinator {
return Coordinator(self)
}
func makeUIView(context: UIViewRepresentableContext<MyDatePicker>) -> UIDatePicker {
let picker = UIDatePicker()
// listen to changes coming from the date picker, and use them to update the state variable
picker.addTarget(context.coordinator, action: #selector(Coordinator.dateChanged), for: .valueChanged)
return picker
}
func updateUIView(_ picker: UIDatePicker, context: UIViewRepresentableContext<MyDatePicker>) {
picker.minuteInterval = minuteInterval
picker.date = selection
switch displayedComponents {
case .hourAndMinute:
picker.datePickerMode = .time
case .date:
picker.datePickerMode = .date
case [.hourAndMinute, .date]:
picker.datePickerMode = .dateAndTime
default:
break
}
}
class Coordinator {
let datePicker: MyDatePicker
init(_ datePicker: MyDatePicker) {
self.datePicker = datePicker
}
@objc func dateChanged(_ sender: UIDatePicker) {
datePicker.selection = sender.date
}
}
}
struct DatePickerDemo: View {
@State var wakeUp: Date = Date()
@State var minterval: Int = 1
var body: some View {
VStack {
Stepper(value: $minterval) {
Text("Minute interval: \(minterval)")
}
MyDatePicker(selection: $wakeUp, minuteInterval: minterval, displayedComponents: .hourAndMinute)
Text("\(wakeUp)")
}
}
}
struct DatePickerDemo_Previews: PreviewProvider {
static var previews: some View {
DatePickerDemo()
}
}
推荐阅读
- python - 在numpy数组列中查找某个值的最小和最大索引
- javascript - 单击任何子级时如何获取父级div的类名
- java - Firebase onMessageReceived() 不返回 getNotification
- python - 递归的中间结果
- reactjs - 如何使用 Hooks 转换基于类的 React-Redux 代码
- laravel - 条件形式 Laravel/Livewire
- javascript - js: chrome 在 html5 视频元素上说“net::ERR_CONNECTION_CLOSED”或“加载资源失败”
- vba - MS ACCESS VBA 移动/复制文件
- java - 在 kotlin 中可打包和可序列化
- arduino - #define AVOIDANCE_DELAY 1 和 delay(1) 有什么区别