2010-09-24 14 views
19

Acabo de empezar a usar UIDatePicker en mi aplicación para iPad, pero ¿hay alguna manera de verificar cuándo se ha cambiado la fecha?UIDatePicker: al cambiar la fecha

Quiero hacer algo cuando se cambia la fecha. Espero que puedas ayudar, gracias.

Respuesta

69

Cuando configurado correctamente, un objeto UIDatePicker envía una acción mensaje cuando un usuario acaba de rotación una de las ruedas para cambiar la fecha o el tiempo; el evento de control asociado es UIControlEventValueChanged.

Así que hay que añadir su clase para manejar UIControlEventValueChanged evento en su selector:

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

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

Vale la pena señalar que la parte ': (id) remitente' es esencial para que funcione la función' dateChanged'. Obtendrás errores sin eso. –

+1

@Chimp No veo que el remitente: (id) sea realmente necesario, al menos no en iOS 5. Quizás verifique que su declaración coincida con su implementación. –

+0

: el remitente (id) no es "necesario" per se, pero es una convención útil que se usa en todo el SDK de iOS. Si no desea que el remitente (id) siga el método, haga lo siguiente: [picker addTarget: self action: @selector (dateChange) forControlEvents: UIControlEventValueChanged]; – Ben

0

versión rápida

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 Versión:

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

Esto no parece funcionar si hace clic en hecho para establecer el valor predeterminado. Tengo que desplazarme a un valor diferente y retroceder a la configuración predeterminada, luego hacer clic en "Hecho". ¿Algunas ideas? – Ryan

+0

Ryan, solo guardo los valores seleccionados en el UIDatePicker en un archivo Plist en cada selección, de modo que si la aplicación se apaga en cualquier forma o si se apaga, el último valor seleccionado se puede volver a cargar cuando el programa se inicie de nuevo. No guarda el valor solo en el selector. Los datos viven de esa manera más allá del control. No hay ningún botón si el selector se arrastra de los controles a la forma. –

0

Swift 4 versión:

Configuración

UIDatePicker:

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

Función:

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

Si te fijas, Swift 4 requiere @objc en la función de si se va a utilizar #selector()

Cuestiones relacionadas