テキストフィールドをタップすると、datepickerを表示しようとしています。これはすべて問題なく動作しているようですが、日付ピッカーを閉じるとすぐにキーボードが表示されます。日付ピッカーを超えたキーボード
実際に消える前に、基本的には2回却下する必要があります。
私は、次の
EDITは、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
}
}
}
このクラスにすべてのコードを動かし見えピッカーのためのTextFieldクラスを作成しましたが、日付ピッカーを示すために、完全に責任があります1つの画面に複数の異なるピッカーが必要な場合に、正しい日付ピッカーを表示することができます。
EDIT 2
誰が、それは何の問題もなく正常に動作します私のコードをしようとした場合。私が抱えていた問題は、自分のカスタムクラスを私のUITextField
が入ったUIView
に間違って設定していたので、テキストフィールドをタップしたときにキーボードが最初にUIView
、次にUIDatePicker
のキーボードがトリガーされたので、UIDatePicker
は辞任しましたそこ。
https://blog.apoorvmote.com/change-textfield-input-to-datepicker/
私はあなたの提案を試みたが、運が残念ながら... – NoSixtiesあなたは両方でそれを追加していないか、両方に個別にして、まず – joshLor
@NoSixtiesを試してみたが、それ – joshLor