0
我试图在您点击文本框时显示日期选择器。这一切似乎工作正常,但只要我解雇日期选择器,它将显示键盘。键盘超越日期选择器
所以我基本上必须解雇它2次才会真正消失。
我已经创造了它看起来以下
编辑感动了所有的代码插入到TextField类
protocol TextFieldPickerDelegate {
func pickerValueDidChange(date: Date, pickerMode: UIDatePickerMode, sender: TextFieldPicker)
}
public class TextFieldPicker: UITextField, UITextFieldDelegate {
var pickerMode: UIDatePickerMode = .date
@IBInspectable var pickerType: String? {
willSet {
for s in (newValue?.lowercased().getStrings())! {
switch s {
case "date":
pickerMode = .date
case "dateandtime":
pickerMode = .dateAndTime
case "countdowntimer":
pickerMode = .countDownTimer
case "time":
pickerMode = .time
default:
pickerMode = .date
}
}
}
didSet {
setupTextField()
}
}
var textFieldPickerDelegate: TextFieldPickerDelegate?
func setupTextField() {
createPicker()
}
override public func draw(_ rect: CGRect) {
super.draw(rect)
delegate = self
}
override public func caretRect(for position: UITextPosition) -> CGRect {
return CGRect.zero
}
override public func shouldChangeText(in range: UITextRange, replacementText text: String) -> Bool {
return false
}
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return false
}
public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
self.resignFirstResponder()
return true
}
public func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
self.resignFirstResponder()
return true
}
func createPicker() {
let datePicker = UIDatePicker()
datePicker.datePickerMode = pickerMode
datePicker.addTarget(self, action: #selector(pickerValueChange(_:)), for: .valueChanged)
let pickerToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 44))
pickerToolBar.tintColor = UIColor.gray
let doneButton = UIBarButtonItem(title: NSLocalizedString("done", comment: ""), style: .done, target: self, action: #selector(closePicker(_:)))
let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
pickerToolBar.setItems([space, doneButton], animated: true)
self.inputView = datePicker
self.inputAccessoryView = pickerToolBar
}
func closePicker(_ sender: Any) {
self.resignFirstResponder()
}
func pickerValueChange(_ sender: UIDatePicker) {
self.textFieldPickerDelegate?.pickerValueDidChange(date: sender.date, pickerMode: sender.datePickerMode, sender: self)
}
public func getDateString(date: Date, format: String) -> String {
let timeFormatter = DateFormatter()
timeFormatter.dateFormat = format
return timeFormatter.string(from: date)
}
}
// =================================================== OptionSet =================================================== \\
public struct PickerModes: OptionSet {
private enum PickerMode: Int, CustomStringConvertible {
case Date=1
case DateAndTime=2
case CountDownTimer=4
case Time=8
public var description: String {
var shift = 0
while (rawValue.hashValue >> shift != 1) { shift += 1 }
return ["date", "dateandtime", "countdowntimer", "time"][shift]
}
}
public let rawValue: Int
public init(rawValue: Int) { self.rawValue = rawValue }
private init(_ mode: PickerMode) { self.rawValue = mode.rawValue }
static let Date = PickerModes(PickerMode.Date)
static let DateAndTime = PickerModes(PickerMode.DateAndTime)
static let CountDownTimer = PickerModes(PickerMode.CountDownTimer)
static let Time = PickerModes(PickerMode.Time)
}
extension String {
func getStrings() -> [String] {
var stringArray: [String] = []
let strings = self.characters.split{$0 == ","}.map(String.init)
for s in strings {
let string = s.removeSpaces()
stringArray.append(string)
}
return stringArray
}
func removeSpaces() -> String {
if self.characters.first == " " {
var copy = self
copy.characters.removeFirst()
return copy.removeSpaces()
} else {
return self
}
}
}
这个类的器中选择一种文本框类是用于显示日期选取器负全部责任并处理显示正确类型的日期选择器,以防一个屏幕中需要多个不同的选择器。
编辑2
如果其他人尝试我的代码,它会正常工作,没有任何问题。我遇到的问题是,我不小心将我的自定义类设置为包含我的UITextField
的UIView
,所以当我点击文本字段时,它将首先触发键盘的UIView
,然后UIDatePicker
,所以当UIDatePicker
辞职时,键盘仍然是那里。
我想你的建议,但没有运气不幸...... – NoSixties
你加它在两个或尝试每个单独 – joshLor
@NoSixties什么分别,然后发生 – joshLor