Ich versuche, einen Datentelektor anzuzeigen, wenn Sie auf ein Textfeld tippen. Das scheint alles in Ordnung zu sein, aber sobald ich die Datumsauswahl verlasse, wird stattdessen die Tastatur angezeigt.Tastatur außerhalb der Datumsauswahl
Also muss ich es im Grunde 2 mal ablehnen, bevor es tatsächlich verschwindet.
Ich habe eine Textfield-Klasse für den Picker geschaffen, die die folgenden
EDIT sieht VERSCHOBEN den gesamten Code in das Textfeld CLASS
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
}
}
}
Diese Klasse ist vollständig verantwortlich für die Datumsauswahl zeigt und mit der Anzeige der richtigen Art von Datumsauswahl umzugehen, falls mehrere verschiedene Auswahlhilfen in einem Bildschirm benötigt werden.
EDIT 2
Wenn jemand anderes mein Code versucht, wird es ohne Probleme funktionieren. Das Problem, das ich hatte, ist, dass ich versehentlich meine benutzerdefinierte Klasse auf eine UIView
, die meine UITextField
enthielt so eingestellt, wenn ich das Textfeld angetippt hatte, würde es zunächst die Tastatur für die und dann die UIDatePicker
so auslösen, wenn die UIDatePicker
wurde resigniert die Tastatur wäre immer noch Dort.
Ich habe versucht, Ihre Vorschläge aber kein Glück ... – NoSixties
haben Sie es in beide hinzuzufügen oder jeweils einzeln – joshLor
@NoSixties versuchen, was – joshLor