2017-12-26 14 views
0

私はtextFieldを更新するdatePickerを持っています。 textFieldデータが変更されると、データの検証などの操作が実行されます。問題は、datePickerがtextFieldを更新した後、textFieldがtextFieldで使用しているアクションイベント(.ValueChangedなど)に関係なく、textFieldが何のアクションも実行しないことです。問題が何であるか把握できません。私は、テキストフィールドに何かを入力すると、アクションイベントが動作することに気付きました。ここ は私のコードです:UITatePickerアクションイベントでUITextFieldがアクションイベントをトリガーしない

class CustomTextField: UITextField, UITextFieldDelegate { 

    var customDelegate : CustomTextFieldDelegate? 

    enum type { 
     case standard 
     case date 
    } 

    var textFieldType : type = .standard { 
     didSet{ 
      switch self.textFieldType { 
      case .standard: 
       break 
      case .date: 
       let datePicker = UIDatePicker.MMMddyyyy 
       self.inputView = datePicker 
       datePicker.addTarget(self, action: #selector(refreshOnDatePicker(_:)), for: .valueChanged) 
       self.addTarget(self, action: #selector(checkFieldInput), for: .applicationReserved) 
       break 
      } 
     } 
    } 


    @objc private func checkFieldInput(sender: CustomTextField){ 
     guard let fieldInput = self.text else { return } 
     switch sender.textFieldType { 
      case .standard: 
       break 
      case .date: 
       customDelegate?.isTextFieldVerified = !fieldInput.isEmpty 
      break 
     } 
    } 

    @objc private func refreshOnDatePicker(_ selector: UIDatePicker){ 
     self.text = selector.date.formattedMMMMddyyyy 
    } 
} 


fileprivate extension UIDatePicker { 
    class var MMMddyyyy : UIDatePicker { 
     let currentDate: NSDate = NSDate() 



    let calendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)! 
    calendar.timeZone = NSTimeZone(name: "UTC")! as TimeZone 

    let components: NSDateComponents = NSDateComponents() 
    components.calendar = calendar as Calendar 
    components.year = -100 

    let minDate: NSDate = calendar.date(byAdding: components as DateComponents, to: currentDate as Date, options: NSCalendar.Options(rawValue: 0))! as NSDate 

    let dp = UIDatePicker() 
    dp.datePickerMode = .date 
    dp.minimumDate = minDate as Date 
    dp.maximumDate = currentDate as Date 
    dp.backgroundColor = UIColor.white 
    return dp 
    } 
} 

fileprivate extension Date { 
    /// date formatted type "MMMM dd, yyyy" 
    var formattedMMMMddyyyy: String { 
     let formatter = DateFormatter() 
     formatter.dateFormat = "MMMM dd, yyyy" 
     return formatter.string(from: self) 
    } 
} 
+0

を試してみては日付ピッカーのキーボードで、テキストフィールドです。日付を選択すると、textFieldはエントリを更新して検証する必要があります。 –

+0

データベースのエントリを検証することができましたので、self.checkFieldInput(送信者:自己)を追加し、self.addTargetを削除しました(自己、アクション:#selector(checkFieldInput)、:.editingChanged) –

答えて

1

私が達成しようとしています何この

@objc private func refreshOnDatePicker(_ selector: UIDatePicker){ 
    self.text = selector.date.formattedMMMMddyyyy 
    self.checkFieldInput(sender:self) 
} 
+0

try edit .... ... –

+0

さて、.ValueChangedまたは ".anything"は機能しません。確かに "self.checkFieldInput(送信者:自己)"が動作します。しかし、私はこれがむしろハックではないと感じていますか?私はそれが動作することを意味するが、どのように来る.ValueChangedは動作しません?私はそれを得ていない。正しく構成するにはどうすればいいですか? –

+0

valueChangedが動作し、それがトリガされたときにrefreshOnDatePickerが呼び出され、新しいテキストがtextfeildに設定され、その内容を検証するメソッドが呼び出されます。 –

関連する問題