ios 在选择年份时,关闭UIDatePicker By AddTarget函数也会关闭

kmb7vmvb  于 2023-07-01  发布在  iOS
关注(0)|答案(1)|浏览(101)

我试图在通过addTarget函数选择日期期间关闭datePicker。在我选择年份之后,它在我选择日期之前就关闭了,当我先选择日期时,我不能选择年份。我实际上想要的是,在选择年份时,它不应该被解雇。当我选择日期时,它应该会消失。是否有任何可能的解决方案,这与使用UIdatePicker?
这是我的密码

let datePicker : UIDatePicker = {
    let date = UIDatePicker()
    date.datePickerMode = .date
    date.preferredDatePickerStyle = .compact
    date.tintColor =  UIColor(red: 83/255, green: 176/255, blue: 184/255, alpha: 1)
    return date
}()
func config() {
    datePicker.addTarget(self, action: #selector(selectButtonAction), for: .primaryActionTriggered)
}
@objc func selectButtonAction() {
    // code logic ...

    dismiss(animated: true)
}
t8e9dugd

t8e9dugd1#

如果我理解正确的话,当用户在这种状态下选择一个日期时,你想关闭当前的VC:

但如果用户在此状态下更改了月份/年份,您不想执行任何操作:

没有官方支持的方法来做到这一点-你不应该以这种方式使用UIDatePicker
我建议添加一个“确定”按钮或类似的东西,让用户确认他们已经选择了一个日期。考虑一下用户在日历上误点击的情况,最终意外地关闭了整个VC。如果你问我的话,我觉得这很令人沮丧。
如果你真的想要这样的行为,我建议你自己做一个日期选择器。
也就是说,月-年选择器毕竟是一个UIView,并且可以在视图层次结构中找到。经过一些逆向工程,该视图被称为_UICalendarMonthYearSelector,从iOS 16开始。
因此,理论上,在selectButtonAction中,您可以尝试在层次结构中找到此视图,如果找到了,则不执行dismiss。这严重受制于UIDatePickerUICalendarView实现的变化。这在将来可能会打破。

func findViewInViewHierarchy(root: UIView, target: AnyClass) -> UIView? {
    if root.isKind(of: target) {
        return root
    }
    for subview in root.subviews {
        if let found = findViewInViewHierarchy(root: subview, target: target) {
            return found
        }
    }
    return nil
}

@objc func selectButtonAction() {
    // for .compact style date pickers, use presentedViewController.view! as the root
    // for .inline style date pickers, use the date picker itself as the root
    let monthYearSelector = findViewInViewHierarchy(root: presentedViewController.view!, target: NSClassFromString("_UICalendarMonthYearSelector")!)
    if calendar == nil {
        // dismiss...
    }
}

如果您真的想关闭.compact样式的日期选择器显示的弹出窗口,而不是self,请参阅this answer of mine

相关问题