2017-05-27 21 views
0

テキストフィールドをタップすると、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は辞任しましたそこ。

答えて

0

私はいくつかの研究を行っており、テキストフィールド内に日付ピッカーを作成する方がはるかに簡単な方法があるようです。あなたはただそれらの1つを使うことができます。

+0

https://blog.apoorvmote.com/change-textfield-input-to-datepicker/私はあなたの提案を試みたが、運が残念ながら... – NoSixties

+0

あなたは両方でそれを追加していないか、両方に個別にして、まず – joshLor

+0

@NoSixtiesを試してみたが、それ – joshLor