【问题标题】:NSDatePicker focus on day of the month editingNSDatePicker 专注于月份编辑
【发布时间】:2020-08-26 12:01:12
【问题描述】:

我有一个类似这样的代码:

let datePicker = NSDatePicker(....)
self.addSubview(datePicker)
self.window?.makeFirstResponder(datePicker)

makeFirstResponder 被调用时,第一个元素获得编辑焦点。对于美国地区,这会选择月份中的哪一天,因为日期格式是 DD-MM-YYYY。对于日期格式为 YYYY-MM-DD 的其他地区,YYYY 成为编辑焦点。无论日期格式是什么,如何强制NSDatePicker 开始编辑月份中的某天?

【问题讨论】:

    标签: objective-c swift macos nsdatepicker


    【解决方案1】:

    您可以使用 DateFormatter 方法func dateFormat(fromTemplate tmplate: String, options opts: Int, locale: Locale?) -> String? 来检查当前的语言环境 dateFormat,检查当天的位置并发送 Tab 键 0、1 或 2 次:

    import Cocoa
    
    class ViewController: NSViewController {
    
        @IBOutlet weak var datePicker: NSDatePicker!
    
        override func viewWillAppear() {
            super.viewWillAppear()
            datePicker.locale = .init(identifier: "en_US")
            datePicker.dateValue = Date()
            if view.window?.makeFirstResponder(datePicker) == true {
                selectDayElement(from: datePicker)
            }
        }
    
        func selectDayElement(from datePicker: NSDatePicker) {
            if let firstIndex = DateFormatter
                .dateFormat(fromTemplate: "yyyyMMdd",
                            options: 0,
                            locale: datePicker.locale)?
                .components(separatedBy: .punctuationCharacters)
                .firstIndex(of: "dd") {
                (0..<firstIndex).forEach { _ in
                    datePicker.keyDown(with: NSEvent(cgEvent: CGEvent(keyboardEventSource: nil, virtualKey: 48, keyDown: true)!)!)
                }
            }
        }
    
    }
    

    【讨论】:

    • 以下代码在未选择第一个 NSDatePicker 元素时出现问题。解决方法是重新创建 NSDatePicker 的单元格并重新分配旧单元格的属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2016-12-05
    • 1970-01-01
    • 2020-12-23
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多