2010-09-24 6 views
19

Je viens de commencer à utiliser UIDatePicker dans mon application iPad, mais y a-t-il un moyen de vérifier quand la date a été changée?UIDatePicker - Date de modification

Je veux faire quelque chose lorsque la date est modifiée. J'espère que vous pouvez aider, merci.

Répondre

69

Lorsqu'il est correctement configuré, un objet UIDatePicker envoie une action message lorsqu'un utilisateur se termine en rotation l'une des roues pour changer la date ou l'heure ; l'événement de contrôle associé est UIControlEventValueChanged.

donc vous devez ajouter votre classe pour gérer l'événement UIControlEventValueChanged dans votre préparateur:

[picker addTarget:self action:@selector(dateChanged:) 
       forControlEvents:UIControlEventValueChanged]; 
... 

- (void) dateChanged:(id)sender{ 
    // handle date changes 
} 
+0

Il est à noter que la partie ': (id) sender' est essentielle pour que la fonction' dateChanged' fonctionne. Vous obtiendrez des erreurs sans cela. –

+1

@Chimp Je ne vois pas que l'expéditeur: (id) est réellement nécessaire, du moins pas sur iOS 5. Vérifiez peut-être que votre déclaration correspond à votre implémentation. –

+0

: (id) expéditeur n'est pas "nécessaire" en soi, mais c'est une convention utile qui est utilisée dans iOS SDK. Si vous ne voulez pas: (id) expéditeur suivant la méthode, faites ceci: [picker addTarget: action de soi: @selector (dateChange) forControlEvents: UIControlEventValueChanged]; – Ben

0

la version rapide

override func viewDidLoad() { 
    super.viewDidLoad() 
    let picker = UIDatePicker(frame: CGRectMake(0, 0, 200, 200)) 
    picker.addTarget(self, action: #selector(datePickerChanged(_:)), forControlEvents: .ValueChanged) 
    view.addSubview(picker) 
} 

func datePickerChanged(picker: UIDatePicker) { 
    print(picker.date) 
} 
2

Swift 3 Version:

override func viewDidLoad() { 
    super.viewDidLoad() 

    if sYourSelectedDate == "" { 
     if let plist = Plist(name: "YourPlistName") { 
      sYourSelectedDate = plist.getSingleValueInPlistFile(sFieldName: "yourSelectedDate")! 

     } 
    } 
    if sYourSelectedDateTime == "" { 
     if let plist = Plist(name: "YourPlistName") { 
      sYourSelectedDateTime = plist.getSingleValueInPlistFile(sFieldName: "yourSelectedDateTime")! 

     } 
    } 

    // add dateTimePickerChanged event (e.g., if device is powered down, values get saved) 
    self.dateTimePicker.addTarget(self, action: #selector(dateTimeChanged), for: .valueChanged); 

    // set min and max dates of datetimePicker 
    // subtracting 1 minute from current time 
    let currentTempDate = NSDate() 
    let newDate = currentTempDate.addingTimeInterval(-1 * 60); 
    let currentDate = newDate; 

    let calendar: NSCalendar = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)! 

    calendar.timeZone = NSTimeZone(name: "US/Eastern")! as TimeZone 

    let components: NSDateComponents = NSDateComponents() 
    components.calendar = calendar as Calendar 

    components.year = -1 
    let minDate: NSDate = calendar.date(byAdding: components as DateComponents, to: currentDate as Date, options: NSCalendar.Options(rawValue: 0))! as NSDate 

    let maxDate: NSDate = currentDate as NSDate 

    self.dateTimePicker.minimumDate = minDate as Date 
    self.dateTimePicker.maximumDate = maxDate as Date 

    //print("minDate: \(minDate)") 
    //print("maxDate: \(maxDate)") 

    if(sYourSelectedDateTime == "") 
    { 
     // subtracting 1 minute from current time 
     let currentTempDate = NSDate() 
     let newDate = currentTempDate.addingTimeInterval(-1 * 60); 
     let currentDate2 = newDate; 

     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "MM/dd/yyyy h:mm a" 

     calendar.timeZone = NSTimeZone(name: "US/Eastern")! as TimeZone 

     let userCalendar = Calendar.current 
     let requestedComponents: Set<Calendar.Component> = [ 
      .year, 
      .month, 
      .day, 
      .hour, 
      .minute 
     ] 

     let dateTimeComponents = userCalendar.dateComponents(requestedComponents, from: currentDate2 as Date) 

     let iPhoneDateComponents = NSDateComponents() 
     iPhoneDateComponents.year = dateTimeComponents.year!; 
     iPhoneDateComponents.month = dateTimeComponents.month!; 
     iPhoneDateComponents.day = dateTimeComponents.day!; 
     iPhoneDateComponents.hour = dateTimeComponents.hour!; 
     iPhoneDateComponents.minute = dateTimeComponents.minute!; 
     iPhoneDateComponents.timeZone = NSTimeZone(name: "US/Eastern") as TimeZone? 

     let iPhoneDate = calendar.date(from: iPhoneDateComponents as DateComponents)! 

     self.dateTimePicker.date = iPhoneDate; 
     sYourInitialDateTime = dateFormatter.string(from: self.dateTimePicker.date); 

     if let plist = Plist(name: "YourPlistFile") { 
      plist.editSingleValueInPlistFile(dictString: "YourPlistFile", sFieldName: "yourInitialDateTime", sValue: sYourInitialDateTime) 
     } 

    } else { 
     let dateFormatter: DateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "MM/dd/yyyy h:mm a" 
     let dateObj = dateFormatter.date(from: sYourSelectedDateTime) 
     self.dateTimePicker.date = dateObj! 
    } 

} 

func dateTimeChanged(picker: UIDatePicker) { 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "MM/dd/yyyy" 
    sYourSelectedDate = dateFormatter.string(from: picker.date); 
    dateFormatter.dateFormat = "MM/dd/yyyy h:mm a" 

    sYourSelectedDateTime = dateFormatter.string(from: picker.date); 

    if (sYourSelectedDateTime == sYourInitialDateTime) 
    { 
     sYourSelectedDate = ""; 
     sYourSelectedDateTime = ""; 
    } 

    if let plist = Plist(name: "YourPlistFile") { 
     plist.editSingleValueInPlistFile(dictString: "YourPlistName", sFieldName: "yourSelectedDate", sValue: sYourSelectedDate) 
     plist.editSingleValueInPlistFile(dictString: "YourPlistName", sFieldName: "yourSelectedDateTime", sValue: sYourSelectedDateTime) 

    } else { 
     print("Unable to get Plist") 
    } 
    print(sYourSelectedDate); 
    print(sYourSelectedDateTime); 

} 
+0

Cela ne semble pas fonctionner si vous cliquez sur Terminé pour définir la valeur par défaut. Je dois faire défiler à une valeur différente et revenir à la valeur par défaut, puis cliquez sur terminé. Des idées? – Ryan

+0

Ryan, je ne sauvegarde que les valeurs sélectionnées dans UIDatePicker dans un fichier Plist à chaque sélection, donc si l'application est fermée sur n'importe quel formulaire ou éteint la dernière valeur sélectionnée peut être rechargée lorsque le programme est redémarré. Ne pas enregistrer la valeur uniquement dans le sélecteur. Les données survivent de cette manière après le contrôle. Il n'y a pas de bouton si le sélecteur est déplacé des contrôles pour former. –

0

Swift 4 version:

UIDatePicker Configuration:

let datePicker = UIDatePicker() 
    datePicker.datePickerMode = .date 
    dateTextField.inputView = datePicker 
    datePicker.addTarget(self, action: #selector(datePickerChanged(picker:)), for: .valueChanged) 

Fonction:

@objc func datePickerChanged(picker: UIDatePicker) { 
    print(picker.date) 
} 

Si vous remarquez, Swift 4 exige @objc dans la fonction si vous allez utiliser #selector()