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.
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.
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
}
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)
}
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);
}
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
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. –
Swift 4 versión:
ConfiguraciónUIDatePicker:
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()
Vale la pena señalar que la parte ': (id) remitente' es esencial para que funcione la función' dateChanged'. Obtendrás errores sin eso. –
@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. –
: 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