NSCalendarDate

macvelottemacvelotte Membre
22:24 modifié dans API AppKit #1
On trouve dans l'aide de XCode cet exemple de définition d'une nouvelle date :
NSCalendarDate *now = [NSCalendarDate calendarDate];

NSCalendarDate *nextWeek = [now dateByAddingYears:0 months:0

    days:7 hours:0 minutes:0 seconds:0];

J'écris "bêtement" ce code ...
réponse à  la complilation : cannot find method dateByAddingYears ....

Les exemples de code donnés par Apple seraient-ils faux ????

Réponses

  • BruBru Membre
    22:24 modifié #2
    Alors là , franchement, cela m'étonnerait beaucoup, car je l'utilise souvent cette méthode...

    Soit tu as fait un copier/coller malheureux, soit tu as recopié l'exemple en faisant une faute de frappe (majuscule au lieu de minuscule)...

    Moi je te donne mon exemple :
    [tt]
    NSCalendarDate *d;
    d=[NSCalendarDate calendarDate];
    NSLog(@%@", d);
    d=[d dateByAddingYears:0 months:2 days:0 hours:0 minutes:0 seconds:0];
    NSLog(@%@", d);
    [/tt]
    ce qui donne dans la fenêtre de run log de Xcode :

    [Session started at 2005-01-20 19:24:10 +0100.]
    2005-01-20 19:24:12.063 Vinitheca2[378] 2005-01-20 19:24:12 +0100
    2005-01-20 19:24:12.064 Vinitheca2[378] 2005-03-20 19:24:12 +0100


    .
  • macvelottemacvelotte Membre
    22:24 modifié #3
    Voici mon code :
    NSCalendarDate *jourlune;
    jourlune=[cejour dateByAddingYears:0 months:0 days:jr hours:he minutes:mi]; où jr,he et mi sont des int.
    Et bien, ça ne marche pas !
  • BruBru Membre
    22:24 modifié #4
    dans 1106291526:

    Voici mon code :
    NSCalendarDate *jourlune;
    jourlune=[cejour dateByAddingYears:0 months:0 days:jr hours:he minutes:mi]; où jr,he et mi sont des int.
    Et bien, ça ne marche pas !


    Et... Où est le paramètre seconds: dans ton exemple ?

    Car effectivement, la méthode de Apple, c'est dateByAddingYears:months:days:hours:minutes:seconds:, et non dateByAddingYears:months:days:hours:minutes: !

    .
  • macvelottemacvelotte Membre
    22:24 modifié #5
    Je me pose une nouvelle question : comment activer NSCalendarDate à  interrvalles donnés (1 seconde, 1 minute ..) pour afficher l'heure de façon permanente (faire une horloge, par exemple) ??

  • cbrandtcbrandt Membre
    22:24 modifié #6
    regardes du côté de NSTimer...
  • macvelottemacvelotte Membre
    22:24 modifié #7
    NSTimer OK ...
    Mais je suis toujours aussi perplexe devant "l'aide" de XCode, c'est-à -dire que je n'ai pas encore compris comment on fait !
  • Eddy58Eddy58 Membre
    22:24 modifié #8
    Voici par exemple un timer qui, toutes les 60 secondes, avance ta date de 5 minutes : :)
    [tt]
    -(void)dealloc
    {
    [date release];
    [timer invalidate];
    }

    -(void)awakeFromNib
    {
    NSCalendarDate *date=[[NSCalendarDate calendarDate] retain];
    timer=[NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(changeDate:) userInfo:nil repeats:YES];
    }

    -(void)changeDate:(NSTimer *)timer
    {
    date=[date dateByAddingYears:0 months:0 days:0 hours:0 minutes:5 seconds:0];
    }
    [/tt]
  • macvelottemacvelotte Membre
    22:24 modifié #9
    OK Eddy58 !

    Je vais essayer d'adapter ton exemple à  mon programme .

    Merci!
  • macvelottemacvelotte Membre
    22:24 modifié #10
    Il y a un problème ! :
    le code suivant ne marche pas
    <br />NSTimer *timer;<br />timer=[NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(misealheure) userInfo:nil repeats:YES];<br />.../...<br />-(void)misealheure:(NSTimer *)timer<br />{<br />}<br /><br />
    

    et conduit au message d'erreur :NSTimer discarding exception 'NSInvalidArgumentException' (reason '*** -[Ephemerides misealheure]: selector not recognized') that raised during firing of timer with target 3411a0 and selector 'misealheure'
  • Eddy58Eddy58 Membre
    22:24 modifié #11
    En effet macvelotte, tu as oublié les ":" dans ton sélecteur. Il faut écrire @selector(misealheure:) :)
  • macvelottemacvelotte Membre
    22:24 modifié #12
    Naturellement, il fallait que j'oublie un détail ! ça marche.
    Mais, autre question : comment "synchroniser" l'horloge de mon application avec celle du Mac ?
  • Eddy58Eddy58 Membre
    mars 2005 modifié #13
    L'horloge du système est renvoyée par [NSCalendarDate calendarDate]...je comprend pas ce problème de synchro dont tu parles...???
  • macvelottemacvelotte Membre
    22:24 modifié #14
    OK, mais si j'ai un timer qui actualise la date toutes les 60 secondes par exemple, je ne suis pas forcément en phase avec l'horlage du Mac : il peut y avoir un décalage !
  • cbrandtcbrandt Membre
    mars 2005 modifié #15
    dans ce cas tu peux utiliser une intervalle de 1 seconde pour le timer, puis de n'actualiser que si le nombre de secondes de la date courante est à  0.
    il y a  cepandant le risque de tomber à  côté, mais on peut faire quelque chose comme ça:

    <br />- (void) maMethodeDeTimer: (NSTimer*) timer<br />{<br />    NSCalendarDate   *now;<br />    static int     minutes = -1;<br /><br />    now = [NSCalendarDate calendarDate];<br />    if (minutes != [now minutesOfHour])<br />    {<br />         minutes = [now minutesOfHour];<br />         // insérer ici le code d&#39;actualisation<br />    }<br />}<br />
    


    en gros, on regarde si le nombre de minutes a changé, et si oui on le sauvegarde et on effectue le code voulu...

    edit:
    merci fouf !  :fouf):
  • fouffouf Membre
    22:24 modifié #16
    Attention : ya une coquille dans le code de cbrandt :

    NSCalendarDate *d; -> faut pas oublier le *  ;)
Connectez-vous ou Inscrivez-vous pour répondre.