2017-05-27 4 views
0

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.

Antwort

0

Ich habe einige Nachforschungen gemacht und es scheint mir, dass es viel einfachere Methoden gibt, einen Datumsauswahl innerhalb eines Textfelds zu erstellen. Du könntest einfach einen von ihnen benutzen. leider https://blog.apoorvmote.com/change-textfield-input-to-datepicker/

+0

Ich habe versucht, Ihre Vorschläge aber kein Glück ... – NoSixties

+0

haben Sie es in beide hinzuzufügen oder jeweils einzeln – joshLor

+0

@NoSixties versuchen, was – joshLor

Verwandte Themen