2017-01-06 1 views
0

В моем коде ниже я внедрил сборщик дат, чтобы быть подпунктом моего текстового поля. Я застрял на функции; 'VerifyAge. Оператор if в функции работает нормально и изменит цвет textField, когда дата выбора даты выше или ниже указанной даты. Но он работает только в соответствующем году, но не работает с точным Днем. Я пробовал искать последние два дня и не смог найти решение моей точной проблемы.Расчет времени с даты Выборщик Swift 3

class AgeConfirmViewController: UIViewController, UITextFieldDelegate { 

@IBOutlet weak var txtAgeConfirmation: UITextField! 
let datePicker: UIDatePicker = UIDatePicker() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    txtAgeConfirmation.delegate = self 
    createDatePicker() 
    } 

    func textFieldDidBeginEditing(_ textField: UITextField) { 
    txtAgeConfirmation.inputView = datePicker 
    datePicker.addTarget(self, action: #selector(self.datePickerChanged(sender:)), for: .valueChanged) 
} 



    func datePickerChanged(sender: UIDatePicker) { 
    let formatter = DateFormatter() 
    formatter.timeStyle = .none 
    formatter.dateStyle = .long 
    txtAgeConfirmation.text = formatter.string(from: sender.date) 
    verifyAge() 
} 


    func createDatePicker() { 
    datePicker.datePickerMode = .date 
    datePicker.maximumDate = Calendar.current.date(byAdding: .year, value: 0, to: Date()) 
} 


func verifyAge() { 

    let dateOfBirth = datePicker.date 
    let today = Date() 
    let gregorian = NSCalendar(identifier: NSCalendar.Identifier.gregorian) 
    let age = gregorian?.components([.month, .day, .year], from: dateOfBirth, to: today, options:[]) 

     if (age?.year)! < 21 { 


     txtAgeConfirmation.textColor = UIColor.red 

    } else if (age?.year)! > 21 { 

     txtAgeConfirmation.textColor = UIColor.black 

    } 
} 
+0

Просьба уточнить, если вам нужно, чтобы он был до дня. Значение, если возраст составляет 19 лет 11 часов 59 м, они не мясо в возрасте 20 лет. Вместо вас вы получаете, если они будут 20y в этом году, но еще не 20y. – MwcsMac

+0

Прояснено. «он работает только с соответствующим годом, но не работает с точным днем». Я хочу, чтобы это было точно в день. – pjunior

+0

Попробуйте этот код: http://stackoverflow.com/questions/27182023/getting-the-difference-between-two-nsdates-in-months-days-hours-minutes-seconds –

ответ

3

Простое решение, игнорировать day и month:

let gregorian = Calendar(identifier: .gregorian) 
let ageComponents = gregorian.dateComponents([.year], from: dateOfBirth, to: Date()) 
let age = ageComponents.year! 

txtAgeConfirmation.textColor = age < 21 ? .red : .black 

Или, если вы хотите игнорировать то время

let ageComponents = calendar.dateComponents([.year], from: calendar.startOfDay(for: dateOfBirth), to: calendar.startOfDay(for: Date())) 

В Swift 3 Есть меньше вопросов и восклицательных знаков, используя родной Calendar struct.
Восклицательный знак возраста после year абсолютно безопасен, так как компонент year четко указан.

+0

xcode побудил меня добавить восклицательный знак, и у меня был только год, прежде чем отправить этот вопрос. Я думал, что добавление месяца и дня решит его, но это не так. Я просто изменил его снова, и проблема по-прежнему остается их. – pjunior

+0

Я не уверен, какого результата вы ожидаете, я обновил ответ альтернативой. – vadian

+0

Добавление кода, который вы обновили, помогло, мне не хватало «startOfDay», спасибо – pjunior