NSDatePicker 专注于日期编辑
NSDatePicker focus on day of the month editing
我有一个类似这样的代码:
let datePicker = NSDatePicker(....)
self.addSubview(datePicker)
self.window?.makeFirstResponder(datePicker)
当调用 makeFirstResponder
时,第一个元素获得编辑焦点。对于 U.S 区域,这会选择月份中的某天,因为日期格式为 DD-MM-YYYY。对于日期格式为 YYYY-MM-DD 的其他地区,YYYY 获得编辑焦点。无论日期格式是什么,如何强制 NSDatePicker
开始编辑月份中的第几天?
您可以使用 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)!)!)
}
}
}
}
我有一个类似这样的代码:
let datePicker = NSDatePicker(....)
self.addSubview(datePicker)
self.window?.makeFirstResponder(datePicker)
当调用 makeFirstResponder
时,第一个元素获得编辑焦点。对于 U.S 区域,这会选择月份中的某天,因为日期格式为 DD-MM-YYYY。对于日期格式为 YYYY-MM-DD 的其他地区,YYYY 获得编辑焦点。无论日期格式是什么,如何强制 NSDatePicker
开始编辑月份中的第几天?
您可以使用 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)!)!)
}
}
}
}