date système avec une heure différente ?

2»

Réponses

  • merci pour ta réponse, 


     


    eh bien ce qui me bloque c'est que je n'ai que trois mois de objectiveC dans la tête et que je n'ai pas du tout la façon de penser de la programmation Objet. ça vient doucement. je me paluche des PDF qui expliquent la programmation iPhone, je regarde et fait des tuto avec youtube en essayant de coller des bouts de codes dans mon programme. je sais c'est pas des legos mais c'est la seule manière que j'ai d'avancer.


     


    Ton aide m'est très précieuse.


     


    tu me donnes des pistes très intéressantes que j'ai du mal à  mettre en place.


    Pour toi c'est simple tu es mouleur de chocolat, moi éleveur de cacaoyers.


     


    Par exemple quand tu dis boucler ? tu veux dire faire une boucle if... else... ?


    c'est à  dire que mon tableau va s'écrire lignes par lignes ? et avant d'inscrire la ligne je lui dit de découper Africa/Abidjan... ?

  • En général, une boucle c'est du for ou un while. Rien n'empêche d'avoir es if/else à  l'intérieur, mais ça ne compte pas comme boucler.


  • Pour la boucle for, je vois bien comment faire avec un entier mais avec une liste [timeZone knownTimeZoneNames] je ne vois pas comment faire  ?? 


     


    est ce que je donnes l'information dans le pickerView à  cet endroit :


    -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {


        return [self.rouePays objectAtIndex:row];


     


    ​est ce à  cet endroit que j'utilise  componentsSeparatedByString:@/ ? pour modifier "row"


  • [NSTimeZone knownTimeZoneNames] renvoie un Array de NSString


    Donc une moyen de boucler :



    for (NSString *aString in monArrayTimeZones)
    {
    //faire quelque chose
    }

    ou



    for (int i = 0; i < [monArrayTimeZones count]; i ++)
    {
    NSString *aString = [monArrayTimeZones objectAtIndex:i];
    //faire quelque chose
    }
  • AliGatorAliGator Membre, Modérateur
    Sachant que la première des 2 solutions proposée par Larme, en plus d'être plus lisible, est aussi plus efficace/performante (bon ça se joue à  peu, mais bon).
  • Ok je planche dessus, merci 


    c'est ça qu'il me fallait !


  • bonjour, 


     


    j'ai réussi à  séparer les continents des villes et à  les avoir dans une variable, le problème avec mon code est qu'il fonctionne quand il y a un "/" dans le array, mais cela se complique quand il n'y en a pas dans  [NSTimeZone knownTimeZoneNames]   comme par exemple avec @GMT cela bloque ma requête.


    De plus, il y a des noms avec plusieurs "/" et là  ça bug aussi.


     


    mon souci : 


    - comment passer @GMT dans ma boucle sans que ça plante ?


    - comment gérer les Continents/Pays/villes avec deux "/" ?


     


    je vous mets mon code : 


     


     



     


     


     NSArray *Paysdonnees = [NSTimeZone knownTimeZoneNames];


       


    for (int i = 0; i < [Paysdonnees count]; i ++)


                 {


                NSString *aString = [Paysdonnees objectAtIndex:i];


                


                NSString *str = [NSString stringWithFormat:@%@",aString];


                NSArray *arr = [str componentsSeparatedByString:@/];


            


                if ([aString  isEqual: @GMT]) {


                    NSLog(@bonjour %@",aString);


                    


                }


                NSString *strHi = [arr objectAtIndex:0];


            


                NSString *strHo = [arr objectAtIndex:1];


                


                NSLog(@%@",strHi);


                NSLog(@aString de larme = %@",strHo);



     


    merci

  • Nomme tes variables en commençant par une minuscule.

     



    NSArray *timeZones = [NSTimeZone knownTimeZoneNames];

    for (NSString *aLocation in timeZones)
    {
    NSArray *continentsCountryCity = [aLocation componentsSeparatedByString:@/];

    if ([continentsCountryCity count] >= 2)
    {
    NSLog(@Continent: %@", [continentsCountryCity objectAtIndex:0]);
    NSLog(@City: %@", [continentsCountryCity lastObject]);
    }
    }

    NSString *str = [NSString stringWithFormat:@%@", aString]; : Intérêt ?


    On préfèrera faire un isEqualToString avec 2 NSString


    Il faut que tu vérifies combien il y a d'éléments dans le NSArray que tu as créé avec componentsSeparatedByString. Car objectAtIndex:1 risque de planter.


    J'ai mis dans mon exemple : lastObject, car parfois, c'est Continent/Pays/Ville, et non pas que Continent/Ville

  • merci Larme, 


    je vais changer les majuscules des variables, 


     


    super l'idée de "lastObject"! ça me permet de passer mon problème de @GMT qui dans la liste était tout seul ! 


     


    Par contre, ça fait bizarre parcequ'il me met ex:  "America / Port au Prince", je sais que c'est en termes de fuseaux horaires mais ça fait bizarre ! je ne sais pas si la personne qui part en Martinique va penser à  sélectionner America dans le pickerView de gauche pour faire apparaitre Port au Prince dans le pickerView de droite ! 


     


    peut-être vaut il mieux que je reste sur l'idée d'une table indexée par villes ? plutôt que deux PickerView avec Continents et Villes.


     


    qu'en penses tu ?

  • LarmeLarme Membre
    janvier 2014 modifié #41

    super l'idée de "lastObject"! ça me permet de passer mon problème de @GMT qui dans la liste était tout seul !

    Oui et non.
    En fait, ce qui évite de rentrer dans le GMT tout seul, c'est que je regarde combien d'objets au NSArray.
    Si j'avais pas fait ce test (count == 2), tu aurais eu dans les logs Continent:GMT; City:GMT.
    Le lastObject me permet surtout d'éviter ça :
    if ([continentsCountryCity count] == 2)
    {
    NSLog(@Continent: %@", [continentsCountryCity objectAtIndex:0]);
    NSLog(@City: %@", [continentsCountryCity objectAtIndex:1]);
    }
    else if [continentsCountryCity count] == 3)
    {
    NSLog(@Continent: %@", [continentsCountryCity objectAtIndex:0]);
    NSLog(@City: %@", [continentsCountryCity objectAtIndex:2]);
    }

    Quant au soucis de la Martinique, si dans ton UIPicker, tu dis clairement qu'on choisit son continent, il ne devrait pas avoir de soucis. Je pense que les Martiniquais sont au courant qu'ils ne sont en pas en Europe géographiquement.
  • super ça avance très bien ! 


     


    Quand on fait un NSMutableDictionary est -ce que l'on écrit ligne à  ligne ou bien il faut que je le sorte de ma boucle ?



    for (NSString *aLocation in timeZones)
    {
    NSArray *continentsCountryCity = [aLocation componentsSeparatedByString:@/];

    if ([continentsCountryCity count] >= 2)
    {
    // NSLog(@Continent: %@", [continentsCountryCity objectAtIndex:0]);
    NSMutableArray *continentPickerView = [continentsCountryCity objectAtIndex:0];

    NSMutableArray *villePickerView = [continentsCountryCity lastObject];
    // NSLog(@City: %@", [continentsCountryCity lastObject]);

    NSMutableArray *villeObjects = [NSMutableArray arrayWithObjects: villePickerView, nil];
    NSMutableArray *continentKeys = [NSMutableArray arrayWithObjects: continentPickerView, nil];
    NSMutableDictionary *leDictionnaire = [[NSMutableDictionary alloc]
    initWithObjects: villeObjects forKeys: continentKeys];

    NSLog(@le dico = %@",leDictionnaire);
    NSLog (@Nombre d'entrées mémorisées dans le dictionnaire = %i,[leDictionnaire count]);

    NSArray *keyL = [leDictionnaire allKeys];

    // values in foreach loop
    for (NSString *key in keyL) {
    NSLog(@%@ is %@",key, [leDictionnaire objectForKey:key]);
    }


    }


    Je n'arrive pas à  remplir le dictionnaire, il y a un objet "key" et "objects" à  chaque passage mais il se vide à  chaque boucle .


     


    Puis je solliciter encore votre super pouvoir ?!


    merci beaucoup.

  • J'avoue ne pas être sûr de bien expliquer cela, mais :


     


    Tu utilises des variables locales, qui ne sont présentes que dans le bout de code que tu utilises.


    Exemple :



    -(void)doSomething
    {
    int variableA = 3;
    NSLog(@a: %d, a);
    }

    variableA n'existe que dans ce bout de code.


     


    Maintenant, on rajoute des {}.

    Du coup :



    -(void)doSomething
    {
    int variableB = 4
    {
    int variableA = 3;
    NSLog(@a: %d, a);
    NSLog(@b: %d, b);
    }
    //Ici, je ne connais pas de variableA (elle a cessé d'existé à  la sortie des bracklets, mais je connais une variableB par contre.
    }

    En général, on ne mets pas des {} gratuitement comme ça (c'est mis via un for, if, etc.)


  • Pour moi c'est clair ! merci Larme.


    Donc je dois remplir mon tableau à  l'intérieur des bracklets de la boucle tant que mes variables sont connues. 


     


    Est ce qu'un dictionnaire se rempli au fur et à  mesure ? car les exemples que je vois sont des objets qui sont rentrés manuellement et non pas par incrémentation.


     


    par exemple : 



    NSMutableDictionary *dicto = [[NSMutableDictionary alloc] init];
    [dicto setObject:@John forKey:@Firstname];
    [dicto setObject:@Doe forKey:@Lastname];
    [dicto setObject:@info at objectgraph.com forKey:@Email];
  • Exactement.

    Il faut que tu mettes/déclares à  un " plus haut niveau " ton NSMutableDictionnary (avant la boucle for par exemple).

    Et que tu le remplisses au fur et à  mesure avec les setObject:forKey.


  • ça ne copie pas les values :-(



    NSMutableDictionary *dicto = [[NSMutableDictionary alloc] init];
    NSLog(@" dicto valeur is %@",dicto);

    for (NSString *aLocation in timeZones)
    {
    NSArray *continentsCountryCity = [aLocation componentsSeparatedByString:@/];

    if ([continentsCountryCity count] >= 2)

    {
    //NSLog(@Continent: %@", [continentsCountryCity objectAtIndex:0]);
    NSMutableArray *continentPickerView = [continentsCountryCity objectAtIndex:0];


    NSMutableArray *villePickerView = [continentsCountryCity lastObject];
    //NSLog(@City: %@", [continentsCountryCity lastObject]);

    [dicto setObject:villePickerView forKey:continentPickerView];
    }


    ça passe les value une par une encore, est ce qu'il faut que j'utilise la fonction copyitems ? ou est ce qu'il faut que je remplisse un dictionnaire à  l'intérieur et que cela nourrisse celui à  l'extérieur des bracklets ?


  • J'ai pas testé, mais d'un rapide coup d'oe“il, je dirais que tu as 5 entrées de type : Continent : DernièreVilleDeCeContinent.

    Auquel cas c'est normal.


     


    Un NSDictionary fonctionne ainsi :
    Clé " Valeur (Key"Value/Object).


    Le soucis, c'est qu'il y a unicité des clés.


    En bref, si tu fais :



    NSMutableDictionary *dico = [[NSMutableDictionary alloc] init];
    [dico setObject:@First forKey:@MaCle];
    [dico setObject:@Second forKey:@MaCle];

    En sortie, tu n'auras que


    MaCle " First


     


    La Doc le dit clairement :



     


    setObject:forKey:

    Adds a given key-value pair to the dictionary.


    - (void)setObject:(id)anObject forKey:(id < NSCopying >)aKey



    Parameters

    anObject

    The value for aKey. A strong reference to the object is maintained by the dictionary. Raises anNSInvalidArgumentException if anObject is nil. If you need to represent a nil value in the dictionary, use NSNull.




    aKey

    The key for value. The key is copied (using copyWithZone:; keys must conform to the NSCopying protocol). Raises an NSInvalidArgumentException if aKey is nil. If aKey already exists in the dictionary anObject takes its place.




     





     




     


    L'idée ici, serait donc de mettre un NSArray en object pour chaque clé Continent. En bref, il faut réfléchir à  nouveau sur ton algo/comment enregistrer les données.


Connectez-vous ou Inscrivez-vous pour répondre.