| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 | //  DateFieldRow.swift//  Eureka ( https://github.com/xmartlabs/Eureka )////  Copyright (c) 2016 Xmartlabs SRL ( http://xmartlabs.com )////// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to deal// in the Software without restriction, including without limitation the rights// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell// copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions://// The above copyright notice and this permission notice shall be included in// all copies or substantial portions of the Software.//// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN// THE SOFTWARE.import Foundationimport UIKitpublic protocol DatePickerRowProtocol: class {    var minimumDate: Date? { get set }    var maximumDate: Date? { get set }    var minuteInterval: Int? { get set }}open class DateCell: Cell<Date>, CellType {    public var datePicker: UIDatePicker    public required init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {        datePicker = UIDatePicker()        super.init(style: style, reuseIdentifier: reuseIdentifier)    }    required public init?(coder aDecoder: NSCoder) {        datePicker = UIDatePicker()        super.init(coder: aDecoder)    }    open override func setup() {        super.setup()        accessoryType = .none        editingAccessoryType =  .none        datePicker.datePickerMode = datePickerMode()        datePicker.addTarget(self, action: #selector(DateCell.datePickerValueChanged(_:)), for: .valueChanged)    }    deinit {        datePicker.removeTarget(self, action: nil, for: .allEvents)    }    open override func update() {        super.update()        selectionStyle = row.isDisabled ? .none : .default        datePicker.setDate(row.value ?? Date(), animated: row is CountDownPickerRow)        datePicker.minimumDate = (row as? DatePickerRowProtocol)?.minimumDate        datePicker.maximumDate = (row as? DatePickerRowProtocol)?.maximumDate        if let minuteIntervalValue = (row as? DatePickerRowProtocol)?.minuteInterval {            datePicker.minuteInterval = minuteIntervalValue        }        if row.isHighlighted {            textLabel?.textColor = tintColor        }    }    open override func didSelect() {        super.didSelect()        row.deselect()    }    override open var inputView: UIView? {        if let v = row.value {            datePicker.setDate(v, animated:row is CountDownRow)        }        return datePicker    }    @objc func datePickerValueChanged(_ sender: UIDatePicker) {        row.value = sender.date        detailTextLabel?.text = row.displayValueFor?(row.value)    }    private func datePickerMode() -> UIDatePicker.Mode {        switch row {        case is DateRow:            return .date        case is TimeRow:            return .time        case is DateTimeRow:            return .dateAndTime        case is CountDownRow:            return .countDownTimer        default:            return .date        }    }    open override func cellCanBecomeFirstResponder() -> Bool {        return canBecomeFirstResponder    }    override open var canBecomeFirstResponder: Bool {        return !row.isDisabled    }}open class _DateFieldRow: Row<DateCell>, DatePickerRowProtocol, NoValueDisplayTextConformance {    /// The minimum value for this row's UIDatePicker    open var minimumDate: Date?    /// The maximum value for this row's UIDatePicker    open var maximumDate: Date?    /// The interval between options for this row's UIDatePicker    open var minuteInterval: Int?    /// The formatter for the date picked by the user    open var dateFormatter: DateFormatter?    open var noValueDisplayText: String? = nil    required public init(tag: String?) {        super.init(tag: tag)        displayValueFor = { [unowned self] value in            guard let val = value, let formatter = self.dateFormatter else { return nil }            return formatter.string(from: val)        }    }}
 |