2017-01-06 9 views
0

In meinem Code unten habe ich eine Datumsauswahl implementiert, um die Unteransicht meines Textfelds zu sein. Ich bin auf der Funktion fest; 'verifyAge'. Die if-Anweisung in der Funktion funktioniert einwandfrei und ändert die textField-Farbe, wenn das Datumsauswahldatum über oder unter dem angegebenen Datum liegt. Aber es funktioniert nur bis zum entsprechenden Jahr Aber funktioniert nicht zum genauen Tag. Ich habe versucht, die letzten zwei Tage zu suchen und konnte keine Lösung für mein genaues Problem finden.Berechnen Alter von Datum Picker 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

Bitte klären Sie, wenn Sie brauchen, um auf den Tag zu sein. Das heißt, wenn das Alter 19 Jahre 11 Stunden 59 Minuten ist, dann sind sie nicht älter als 20 Jahre. Statt dessen geht es darum, ob sie in diesem Jahr 20 Jahre alt werden, aber noch nicht 20 Jahre alt sind. – MwcsMac

+0

Es ist klargestellt. "Es funktioniert nur bis zum entsprechenden Jahr Aber funktioniert nicht zum genauen Tag". Ich will es genau zum Tag ja haben. – pjunior

+0

Versuchen Sie diesen Code: http://stackoverflow.com/questions/27182023/getting-the-difference-between-two-nsdates-in-months-days-hours-minutes-seconds –

Antwort

3

Einfache Lösung, ignorieren day und 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 

oder wenn Sie die Zeit

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

In Swift 3 gibt es weniger Frage und Ausrufezeichen unter Verwendung nativer ignoriert werden sollen Calendar Struktur.
Das Alter Ausrufezeichen nach ist absolut sicher, da die Komponente eindeutig angegeben ist.

+0

xcode forderte mich auf, das Ausrufezeichen hinzuzufügen, und ich hatte nur Jahr, bevor ich diese Frage einreichte. Ich dachte, Monat und Tag hinzuzufügen würde es lösen, aber es tat es nicht. Ich habe es gerade wieder geändert und das Problem ist immer noch ihre .. – pjunior

+0

Ich bin mir nicht sicher, welches Ergebnis Sie erwarten, ich habe die Antwort mit einer Alternative aktualisiert. – vadian

+0

Das Hinzufügen des Codes, den Sie aktualisiert haben, half mir, ich vermisste den 'startOfDay', Danke – pjunior