Ho appena iniziato a utilizzare UIDatePicker nel mio iPad, ma c'è un modo di controllare se la data è stata cambiata?UIDatePicker - Su Data di modifica
Voglio fare qualcosa quando viene cambiata la data. Spero che tu possa aiutare, grazie.
Ho appena iniziato a utilizzare UIDatePicker nel mio iPad, ma c'è un modo di controllare se la data è stata cambiata?UIDatePicker - Su Data di modifica
Voglio fare qualcosa quando viene cambiata la data. Spero che tu possa aiutare, grazie.
Quando configurato correttamente, un oggetto UIDatePicker invia un'azione messaggio quando un utente termina rotante una delle ruote per cambiare la data o tempo; l'evento di controllo associato è UIControlEventValueChanged.
quindi è necessario aggiungere la classe per gestire UIControlEventValueChanged
evento nella vostra raccoglitrice:
[picker addTarget:self action:@selector(dateChanged:)
forControlEvents:UIControlEventValueChanged];
...
- (void) dateChanged:(id)sender{
// handle date changes
}
versione rapida
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 Versione:
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);
}
Questo non sembra funzionare se si fa clic su fatto per impostare il valore predefinito. Devo scorrere su un valore diverso e tornare al valore predefinito, quindi fare clic su Fatto. Qualche idea? – Ryan
Ryan, sto solo salvando i valori selezionati in UIDatePicker in un file Plist su ogni selezione, quindi se l'applicazione viene arrestata su qualsiasi modulo o spegne il valore selezionato per ultimo, può essere ricaricato quando il programma viene riavviato. Non salvare il valore solo nel selettore. I dati vivono in questo modo oltre il controllo. Non c'è nessun pulsante se il selettore viene trascinato dai controlli alla forma. –
Swift 4 versione:
SetupUIDatePicker:
let datePicker = UIDatePicker()
datePicker.datePickerMode = .date
dateTextField.inputView = datePicker
datePicker.addTarget(self, action: #selector(datePickerChanged(picker:)), for: .valueChanged)
Funzione:
@objc func datePickerChanged(picker: UIDatePicker) {
print(picker.date)
}
Se notate, Swift 4 richiede @objc nella funzione, se avete intenzione di usare #selector()
Vale la pena notare che la parte ': (id) sender' è essenziale per il funzionamento della funzione' dateChanged'. Otterrai errori senza di esso. –
@Chimp Non vedo che il mittente: (id) sia effettivamente necessario, almeno non su iOS 5. È possibile controllare che la dichiarazione corrisponda all'implementazione. –
: il mittente (id) non è "necessario" di per sé, ma è una convenzione utile che viene utilizzata in tutto l'SDK di iOS. Se non vuoi: (id) mittente seguendo il metodo, fai questo: [picker addTarget: self action: @selector (dateChange) forControlEvents: UIControlEventValueChanged]; – Ben