【问题标题】:DatePicker using Time-Interval in SwiftUIDatePicker 在 SwiftUI 中使用时间间隔
【发布时间】:2020-02-24 13:12:46
【问题描述】:

我想在 SwiftUI 中使用 DatePicker,它工作正常且符合预期。我想添加一个时间间隔,如解释:UIDatePicker 15 Minute Increments Swift

DatePicker("Please enter a time", selection: $wakeUp, displayedComponents: .hourAndMinute)

在 SwifUI 中有修改器吗?

【问题讨论】:

    标签: swift datepicker swiftui uidatepicker


    【解决方案1】:

    我不相信有一个修饰符。但是,可以通过使用 UIViewRepresentable 包装 UIDatePicker 来“自己做”:

    此代码的基本结构基于Interfacing with 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()
        }
    }
    
    

    【讨论】:

    • 谢谢@jtbandes,这是满足我要求的有效解决方案。一般来说,我不希望“自己”这样做。
    • @jtbandes 这是一个很好的解决方案!然而,由于某种原因,MyDatePicker 占据了整个 SwiftUI 视图(选择器本身是正常大小的,但它会将周围的所有东西推出来并用空白空间填充整个视图)。关于为什么以及如何解决的任何想法?我很想用这个!
    • 找到了解决办法!添加以下修饰符以缩小其大小:.frame(height: 100).mask(Rectangle())。再次感谢您的出色解决方案!
    猜你喜欢
    • 2020-03-17
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    相关资源
    最近更新 更多