2017-12-26 32 views
0

textPield를 업데이트하는 datePicker가 있습니다. textField 데이터 변경이 작업 (예 : 데이터 확인)을 수행해야합니다. 문제는 datePicker가 textField를 업데이트 한 후 textField가 textField에서 사용하고있는 어떤 이벤트 (예 : .ValueChanged.I)가 문제인지 파악할 수 없더라도 textField가 어떤 작업도 수행하지 않는다는 것입니다. textField에 뭔가를 입력하면 액션 이벤트가 작동한다는 것을 알았습니다.UITextPield가 UIDatePicker 액션 이벤트시 동작 이벤트를 발생시키지 않습니다.

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입니다보십시오 : 다음은 내 코드입니다. 날짜를 선택하면 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에 새 텍스트를 설정하고 해당 내용의 유효성을 검사하는 메서드를 호출합니다. –