2017-05-27 28 views
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
如果其他人尝试我的代码,它会正常工作,没有任何问题。我遇到的问题是,我不小心将我的自定义类设置为包含我的UITextFieldUIView,所以当我点击文本字段时,它将首先触发键盘的UIView,然后UIDatePicker,所以当UIDatePicker辞职时,键盘仍然是那里。

回答

0

我一直在做一些研究,在我看来,有更简单的方法在文本字段内创建日期选择器。你可以使用其中的一个。 https://blog.apoorvmote.com/change-textfield-input-to-datepicker/

+0

我想你的建议,但没有运气不幸...... – NoSixties

+0

你加它在两个或尝试每个单独 – joshLor

+0

@NoSixties什么分别,然后发生 – joshLor

相关问题