2009-02-21 9 views
4

Je vais avoir une légère difficulté à comprendre pourquoi le code suivant se bloque une application de la mine:émet NSDate et NSDateFormatter

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MMMM d, yyyy"]; 
NSDate *date = [dateFormatter dateFromString:cDate]; 
datePicker.date = date; 
NSString *dateStr = [dateFormatter stringFromDate:date]; 
[dateLabel setText:dateStr]; 
[dateFormatter release]; 

Si je commente ce qui précède sur, app est très bien. Aussi, si je change le format de date à aucun accident se produit suivant:

[dateFormatter setDateFormat:@"yyyy-MM-dd"]; 

Dans mon délégué UIDatePicker, j'ai le code répété qui ressemble à ce qui suit (et fonctionne très bien):

-(IBAction)datePickerValueChanged:(id)sender 
{ 
    NSDate *date = [datePicker date];  
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
    [dateFormatter setDateFormat:@"MMMM d, yyyy"]; 
    NSString *dateStr = [dateFormatter stringFromDate:date]; 
    [dateLabel setText:dateStr]; 
} 

L'erreur je reçois est la suivante:

*** Assertion failure in -[UIDatePickerView _updateBitsForDate:andReload:animateIfNeeded:], /SourceCache/UIKit/UIKit-747.38/UIDatePicker.m:892 

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: date' 
+0

Pour les personnes qui rencontrent cela dans le futur: cette assertion est levée lorsque l'instance de 'NSDate' passée à' setDate: 'ou' setDate: animated: 'est en fait' nil'. –

Répondre

3

le problème est que la date d'entrée est au format, mais la formatter date « aaaa-MM-dd » que vous utilisez avec dateFromString est formaté "MMMM d, aaaa". Vous devrez essayer d'analyser les deux formats si vous souhaitez que les deux formats soient acceptés.

Par exemple:

[dateFormatter setDateFormat:@"MMMM d, yyyy"]; 
NSDate *date = [dateFormatter dateFromString:cDate]; 
if (date == nil) { 
    [dateFormatter setDateFormat:@"yyyy-MM-dd"]; 
    date = [dateFormatter dateFromString:cDate]; 
    if (date == nil) { 
     // Handle the situation where the date string could not be parsed 
    } 
} 
+0

Je me suis assuré que c'est le cas, même si je pense que le formatage de cDate est ce qui le brise. Il est fixé à: 1972-01-01. Cela a bien fonctionné lorsque ma chaîne de format était "aaaa-MM-jj". Maintenant que c'est "MMMM d, yyyy" ça plante. – Coocoo4Cocoa

+0

Quelle est la valeur de "date" avant l'affectation au sélecteur de date? Est-il en dehors des valeurs de date minimale et maximale pour le sélecteur? – NilObject

+0

Je crois que le problème est NSDateFormatter ne sait pas comment internet quelque chose dans le format de say: 1990-01-01 et le traduire à setDateFormat: @ "MMMM d, yyyy", il est capable de le faire quand la chaîne de format est "aaaa-MM-jj". – Coocoo4Cocoa

-1

Si votre appel

NSDate *date = [dateFormatter dateFromString:cDate]; 

échoue, la date est NULL.

Ceci n'est pas écrit dans la documentation.

+1

c'est nul NULL – dlinsin