2015-07-14 23 views
7

Nel mio codice, ho un UITextField che quando l'utente tocca apre un UIDatePicker per consentire all'utente di scorrere facilmente e in modo efficiente fino alla data di nascita. Ovviamente, non vorremmo che UIDatePicker scorresse fino al 2015 e oltre come al momento. Dato che è un campo di inserimento Data di nascita, dovrei anche essere in grado di limitare le voci a 16 anni +. Come faccio a fare questo?Limitare le date UIDatePicker da un momento particolare. Come Input DOB ad un limite di età limitato

class SignUpViewController: UIViewController, UITextFieldDelegate { 

    var datePicker:UIDatePicker! 

    @IBOutlet weak var dateTextField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // UI DATE PICKER SETUP 

     var customView:UIView = UIView(frame: CGRectMake(0, 100, 320, 160)) 
     customView.backgroundColor = UIColor.clearColor() 

     datePicker = UIDatePicker(frame: CGRectMake(0, 0, 320, 160)) 
     datePicker.datePickerMode = UIDatePickerMode.Date 

     customView.addSubview(datePicker) 
     dateTextField.inputView = customView 
     var doneButton:UIButton = UIButton (frame: CGRectMake(100, 100, 100, 44)) 
     doneButton.setTitle("Done", forState: UIControlState.Normal) 
     doneButton.addTarget(self, action: "datePickerSelected", forControlEvents: UIControlEvents.TouchUpInside) 
     doneButton.backgroundColor = UIColor .grayColor() 
     dateTextField.inputAccessoryView = doneButton 

risposta

24

È possibile utilizzare dateByAddingUnit e sottrarre 16 anni dalla data corrente per impostare la data massima per la vostra datepicker come segue:

datePicker.maximumDate = NSCalendar.currentCalendar().dateByAddingUnit(.Year, value: -16, toDate: NSDate(), options: []) 

Xcode 8 beta 6 • Swift 3

datePicker.maximumDate = Calendar.current.date(byAdding: .year, value: -16, to: Date()) 
-2

UIDatePicker ha un maximumDate che è possibile impostare. Basta impostare la modalità "Data" in IB e aggiungere: datePicker.maximumDate = NSDate(timeIntervalSinceNow: -504911232)

-504911232 mezzi 16 prima di oggi (che rappresentano gli anni bisestili)

+0

No, non significa che. 504489600 hanno 15 anni, 11 mesi e 25 giorni. Suggerimento: anni bisestili. Ed è per questo che non esegui calcoli sulla data con secondi. –

+0

Cambiato per conto di circa 4 giorni bisestili – BobRon

+0

Oltre a reinventare NSCalendar puoi provare quello che vuoi, non sarai in grado di risolverlo. I secondi non possono essere utilizzati se si desidera descrivere i tempi relativi che durano più di un'ora. Con un calendario corretto non è possibile tenere conto dell'ora legale, degli anni bisestili o dei giorni saltati (c'è almeno un paese che ha saltato di recente un'intera giornata). –