2015-02-03 3 views
10

Ich habe eine UIDate Picker in eine statische TableViewCell eingebettet und im Moment habe ich den Großteil des Codes mit Ausnahme des Codes für die Datumsauswahl deaktiviert.UIDate Picker valuechanged aktualisiert die erste Drehung nicht, aber alle dreht nach .. iOS

Ich bin mit dem Date Picker als Count Down Timer

Also diese Art von allen, mit Ausnahme einiger üblichen Verkaufsstellen und Vars:

override func viewDidLoad() { 
    super.viewDidLoad() 

    // tfName.delegate = self 
    // tfDescription.delegate = self 
    // 

    datePicker.countDownDuration = 60 

    // pickerValueChanged(self) 

} 


@IBAction func pickerValueChanged(sender: AnyObject) { 

    seconds = Int(datePicker.countDownDuration) 
    hours = seconds/3600 
    if hours == 0{ 
     minutes = seconds/60 
    } else{ 
     minutes = seconds % 3600/60 
    } 
    labelDuration.text = "\(hours) hours \(minutes) minutes" 
} 

Das erste Mal, dass ich den Wert zu ändern des Pickers wird die Funktion "Wertänderung" überhaupt nicht ausgelöst, aber die Spins werden nach der Ausführung ohne Fehler ausgeführt.

Ich habe versucht, es in viewDidLoad, mit pickerValueChanged(self) und das funktioniert, aber das Problem nicht zu lösen. Auch habe ich jede Zeile Code in der pickerValueChanged Funktion und viewDidLoad auskommentiert, aber es hat immer noch nicht den ersten Spin ..

Vielen Dank für Ihre Zeit!

Update: Bilder hinzugefügt

Nach dem ersten Spin, ist pickerValueChanged nicht aufgerufen: First spin

Aus der zweiten Spin und darüber hinaus, wird das Ereignis aufgerufen und das Etikett aktualisiert: Second spin

Versuchte:

Ausführung: datePicker.setDate(NSDate(), animated: true in viewDidLoad() löst das Problem, dass das Ereignis nicht beim ersten Dreh aufgerufen wird, aber das setzt den Ausgangszustand der Datumsauswahl auf die aktuelle Zeit. Da ich dieses Steuerelement verwende, um eine Dauer für ein Ereignis festzulegen, möchte ich es bei 0 Stunden und 1 Minute starten lassen. Dies kann mit datePicker.countDownDuration = 60 getan werden, aber danach kommt das Hauptproblem wieder zurück. Also könnte eine Lösung den DatePicker mit einem NSDate von 1 Minute einstellen, aber wie geht das?

Lösung:

var dateComp : NSDateComponents = NSDateComponents() 
dateComp.hour = 0 
dateComp.minute = 1 
dateComp.timeZone = NSTimeZone.systemTimeZone() 
var calendar : NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)! 
var date : NSDate = calendar.dateFromComponents(dateComp)! 

datePicker.setDate(date, animated: true) 

Antwort

5

ich die folgende Lösung kam die Datepicker-Komponente (im Countdown-Timer-Modus) zu initialisieren und mit 0 Stunden und 1 Minute und es reagiert direkt auf dem ersten Dreh.Da dies scheint einen Fehler und ist sehr frustrierend zu sein, wenn Sie einen Textlabel wollen ihren Wert zu aktualisieren, wenn die Datumsauswahl geändert wird und es nicht auf Anhieb:

var dateComp : NSDateComponents = NSDateComponents() 
dateComp.hour = 0 
dateComp.minute = 1 
dateComp.timeZone = NSTimeZone.systemTimeZone() 
var calendar : NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)! 
var date : NSDate = calendar.dateFromComponents(dateComp)! 

datePicker.setDate(date, animated: true) 

Die Zeitzone Komponente nicht wirklich dafür benötigt wird, für meine Umsetzung arbeiten.

+0

Das funktioniert, bis der DatePicker nicht verschwindet (zum Beispiel wenn ich eine Tabellenzelle habe, die es aufdeckt oder verbirgt). Wenn ich die Zelle öffne, wo der DatePicker ist, ist das Problem wieder da und selbst das Einstellen des Datums des DatePicker hilft nicht. Das ist ziemlich verrückt .... – Dareon

0

Ich weiß nicht, ob ich das Problem habe, aber Datumsauswahl funktioniert das Ziel-Aktionsmuster verwendet und löst diesen Mechanismus, wenn Sie einen Wert ändern.
Wenn das Problem also der erste angezeigte Wert ist, sollten Sie Ihre Variable initialisieren, indem Sie sie als "Standard" -Wert verwenden.

+0

Was passiert, ist das erste Mal, dass ich dem Date Picker einen * Swing "gebe, es spinnt auf einen Wert, löst aber das Value Changed Ereignis überhaupt nicht aus. Aber der zweite Schlag und alles danach löst das Ereignis aus. Auch das Auslösen des Ereignisses von viewDidLoad ändert das Verhalten des Problems nicht. –

1

Ich glaube, Sie sollen diese Delegierten versuchen implementieren statt

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
+0

Ich habe versucht, einen Delegaten für die Datumsauswahl vor, aber dieses Steuerelement hat keinen Delegierten, wie die PickerView hat, wie Andrea auch erklärt –

+1

Oh, ich verstehe. Haben Sie diesen Beitrag gesehen: http://stackoverflow.com/questions/19251803/objective-c-uidatepicker-uicontroleventvaluechanged-only-fired-on-second-select – dminones

+0

Es scheint, dass der Fehler, über den sie sprechen, immer noch da ist. Einstellung datePicker.setDate (NSDate(), animiert: True) in ViewDidLoad löst das Problem teilweise. Der DatePicker aktualisiert nun den Wert mit dem ersten Spin jetzt auf, aber er synchronisiert die Stunden und Minuten mit der Ortszeit. Und ich möchte es mit 1 Minute starten, was ich mit datePicker.countDownDuration = 60 gemacht habe, aber das bricht die Funktion wieder: D. Also muss ich den Picker mit einer NSDate-Konstante mit (0h), 1minute initiieren. Aber ich habe keine Ahnung, wie man das schafft –

1

Es scheint etwas mit dem animierten Parameter zu tun zu haben. Sie müssen nur diese Zeile:

datePicker.setDate(date, animated: true) 
+0

Das schien das Problem für mich zu sein. Ich habe das Datum mit 'animated: false' festgelegt, indem ich es auf' true' änderte. Dadurch wurde meine Zielaktion auch beim ersten Ändern des Wertes aufgerufen. – Marijn

1

Zeit vor fand ich ein weiteres Problem, das irgendwie diese ein ähnelt. Es ging darum, einen View-Controller aus dem tableView:didSelectRowAtIndexPath: zu präsentieren und das Problem war, dass es viel Zeit in Anspruch nahm, bis der neue Controller tatsächlich auftauchte. Eine der Problemumgehungen stellte sich als dispatch_async in der Hauptwarteschlange heraus. Dasselbe hat in diesem Fall für mich funktioniert.

In meinen viewDidLoad, entsandte ich asynchron den Picker Setup-Code auf der Hauptwarteschlange und in meinem Fall, es begann mit dem valueChanged Ereignisse sogar auf dem ersten Pick zu reagieren:

DispatchQueue.main.async { 
    self.pickerView.datePickerMode = .countDownTimer 
    self.pickerView.minuteInterval = 5 
    self.pickerView.countDownDuration = 15 
} 
2

Hier @ Henk- Martijn Lösung & aktualisiert vereinfacht für Swift 3:

let calendar = Calendar(identifier: .gregorian) 
let date = DateComponents(calendar: calendar, hour: 1, minute: 30).date! 
datePicker.setDate(date, animated: true) 

Verwenden Sie den obigen Code anstelle von etwas wie:

datePicker.countDownDuration = 5_400 
Verwandte Themen