Afficher une barre de progression

id0ud0uid0ud0u Membre
01:04 modifié dans API AppKit #1
J'aimerais faire dans mon programme comme la petite barre bleue qui se remplit petit à  petit lorsque l'iPhone charge une page internet mais... est-ce possible sur un mac ? Si oui pouvez-vous me mettre sur la piste de comment faire ? ;)

Réponses

  • CéroceCéroce Membre, Modérateur
    01:04 modifié #2
    NSProgressIndicator
  • id0ud0uid0ud0u Membre
    01:04 modifié #3
    :P merci mais... serait-il possible de m'en dire un peu plus que ça ? ^^
  • Philippe49Philippe49 Membre
    01:04 modifié #4
    La doc

    Tu prends un NSProgressIndicator dans la librairie de IB et tu fais les connections avec ton programme comme d'hab
  • id0ud0uid0ud0u Membre
    01:04 modifié #5
    Je ne saisis pas comment le faire marcher... ce serait pendant qu'une voix lit un texte..
  • Philippe49Philippe49 Membre
    01:04 modifié #6
    Tu utilises NSSpeechSynthesizer pour la lecture ou un fichier audio ?
  • Philippe49Philippe49 Membre
    juin 2009 modifié #7
    Pour le faire marcher c'est tout bête : tu as une minValue, une MaxValue et une doubleValue comme un slider traditionnel.
    Il suffit donc de faire [myProgressIndicator setDoubleValue:aValue]; pour gérer son affichage.

    Maintenant, aValue dépend effectivement de l'état d'avancement de la lecture du texte.
  • id0ud0uid0ud0u Membre
    01:04 modifié #8
    NSSpeechSynthesizer
  • id0ud0uid0ud0u Membre
    01:04 modifié #9
    Donc je place mon NSProgressIndicator avec IB , je le déclare dans mon .h.. et ensuite j'écris mon code dans mon .m
    pourrais-tu juste me montrer à  quoi ressemble le début afin que je puisse trouver la fin tout seul  :) (enfin si j'y arrive  :-\\ )
  • Philippe49Philippe49 Membre
    01:04 modifié #10
    Tu fais de ta classe le delegate du speechSynthesizer.
    Dès lors , ce delegate recevra le message

    - (void)speechSynthesizer:(NSSpeechSynthesizer *)sender willSpeakWord:(NSRange)wordToSpeak ofString:(NSString *)text<br /><br />Parameters<br />sender<br />An NSSpeechSynthesizer object that's synthesizing text into speech.<br />wordToSpeak<br />Word that sender is about to speak into the sound output device.<br />text<br />Text that is being synthesized by sender.<br /><br />Important: The delegate is not sent this message when the NSSpeechSynthesizer object is synthesizing speech to a file (startSpeakingString:toURL:).
    


    Ta classe redéfinit donc cette méthode et y fais le
    [myProgressIndicator setDoubleValue:aValue];
    à  bon escient.
  • id0ud0uid0ud0u Membre
    01:04 modifié #11
    Wouah pour moi qui débute c'est peut-être un peut trop avancé...
    Si je comprends bien ce code me permet ensuite d'utiliser valuemin et max pendant que la voix parle ou j'ai tout faux..?
  • CéroceCéroce Membre, Modérateur
    juin 2009 modifié #12
    La longueur d'une chaà®ne de caractères s'obtient par la méthode -[NSString length].
    Avant de lancer la lecture:
    [speechProgressIndicator setMaxValue:[theText length]];
    



    La méthode suivante sera appelée à  chaque fois que le synthétiseur est prêt à  dire un mot.
    - (void)speechSynthesizer:(NSSpeechSynthesizer *)sender willSpeakWord:(NSRange)wordToSpeak ofString:(NSString *)text<br />{<br />	[speechProgressIndicator setDoubleValue:wordToSpeak.location];<br />}
    


    La position du premier caractère du mot qu'il s'apprête à  dire se trouve dans wordToSpeak.location.

    Au travail maintenant ! Et pas de nouvelle question avant que tu aies passé une heure à  chercher la réponse tout seul, sinon tu resteras éternellement un débutant.  ;)

  • id0ud0uid0ud0u Membre
    01:04 modifié #13
    Bon je cherche mais je ne trouve pas  :(
    - Je déclare un "IBOutlet NSProgressIndicator dans .h;
    - Je place mon NSProgressIndicator avec IB et je le connecte a mon AppControler
    Mais je ne n'y arrive pas par la suite...
    [speechProgressIndicator setMaxValue:[theText length]]; => va dans Init ?
    - (void)speechSynthesizer:(NSSpeechSynthesizer *)sender willSpeakWord:(NSRange)wordToSpeak ofString:(NSString *)text
    {
    [speechProgressIndicator setDoubleValue:wordToSpeak.location];
    } => doit être suivi par quoi ?
    Poulala....
  • AliGatorAliGator Membre, Modérateur
    01:04 modifié #14
    dans 1244218901:

    [speechProgressIndicator setMaxValue:[theText length]]; => va dans Init ?
    Non car dans le init de tes objets créés par le NIB, tes IBOutlets ne sont pas encore connectés.
    Lors du désarchivage d'un NIB :
    - il commence par créer les instances (alloc+initWithFrame pour les NSViews, alloc+initWithCoder pour les objets <NSCoding>-compliant, alloc+init pour les autres NSObjects) des objets que tu as mis dans ton NIB. Donc c'est à  ce moment là  que chaque objet reçoit son init, chacun son tour au fur et à  mesure que chaque objet est créé par le NIB.
    - une fois que tous les objets de ton NIB sont alloués, il commence à  faire eles connections (IBOutlets+IBActions) que tu as configurées dans IB. En effet, il ne peut pas connecter 2 objets entre eux avant d'être sûr que ces 2 objets ont déjà  été créés, donc il faut bien qu'il ne fasse ça que dans nu 2e temps.
    - une fois que toutes les connexions IBOutlets/IBActions ont été réalisés et que le NIB a fini de se charger, un message [tt]awakeFromNib:[/tt] est alors envoyé. C'est dans cette méthode que tu peux alors faire les "réglages finaux", genre ton setMaxValue.

    Ceci dit, pourquoi ne pas modifier la "maxValue" directement depuis IB une fois que tu as placé ton NSProgressIndicator dans ton NIB ?!
  • id0ud0uid0ud0u Membre
    01:04 modifié #15
    J'ai réglé MaxValue et MinValue directement à  partir de IB mais j'aimerais faire correspondre ma barre de progression avec la lecture d'un texte , et c'est là  que repose toute ma difficulté...
  • AliGatorAliGator Membre, Modérateur
    01:04 modifié #16
    Bah dans ce cas c'est bien évidemment juste avant de commencer la lecture du texte, donc quand tu sais quel texte tu vas lui faire lire et avant que la barre de progression n'avance, qu'il faut fixer la maxValue... c'est logique, non ?
  • id0ud0uid0ud0u Membre
    01:04 modifié #17
    (Déjà  désolé d'avoir dérivé du sujet sans créer de nouvelles discussions)
    Ensuite :
    [speechProgressIndicator setMaxValue:[theText length]];
    et
    [speechProgressIndicator setMinValue:0];  ??
    Mais comment le relier à  la lecture ?
  • Philippe49Philippe49 Membre
    01:04 modifié #18
    Cela a été dit plus haut (voir le post de Ceroce notamment)
  • id0ud0uid0ud0u Membre
    01:04 modifié #19
    Je ne comprends pas...
    Et les périodes d'examens approchant je n'ai pas trop trop le temps de m'y pencher... :(
  • AliGatorAliGator Membre, Modérateur
    01:04 modifié #20
    Heu sans vouloir être méchant... si tu ne comprends pas ça, y'a de sacrés concepts de base à  revoir, parce que ce genre de trucs c'est pourtant assez simple... alors si t'en es là , pour le reste tu risques fort de galérer...
    Suis plutôt les tutos classique, relis les bouquins (genre Hillegass) qui expliquent les bases, relis les docs Apple (Programming Topics) sur les delegates, le fonctionnement d'une appli Cocoa en général... avant d'essayer d'aller plus loin, parce que sinon je vois pas ce qu'on peut te dire d'autre...
  • id0ud0uid0ud0u Membre
    01:04 modifié #21
    Aucun souci je sais parfaitement que j'ai de grosses lacunes niveau programmation. Mais j'attends les grandes vacances pour m'améliorer et y passer du temps.
    J'ai trouvé du code sur internet concernant "NSProgressIndicator" mais il n'y avait pas de traces de NSSpeechSynthesizer...
    Merci quand même  ;)
  • laudemalaudema Membre
    01:04 modifié #22
    dans 1244238732:

    J'ai trouvé du code sur internet concernant "NSProgressIndicator" mais il n'y avait pas de traces de NSSpeechSynthesizer...
    Merci quand même  ;)

    Pourquoi chercher sur internet puisque tu as le livre "Programmation sous Mac OS X" qui, au chapitre 3, te montre comment lier un NSSlider à  un Float et au chapitre 4 comment travailler avec NSSpeechSynthesizer ?
    Quand tu as lu ça tu recopies (à  la main ;-) ce qu'il faut pour avoir un "fido"  et un speechSynth qui aura pour délégué ton AppController.
    Quand tu as écrit NSSpeechSynthesizer dans AppController tu le "double-cliques" (pour qu'il soit seul sélectionné) et tu fais un clic droit (ou controle-clic si pas de bouton droit) et tu choisis "Find selected text in API Reference" en bas du menu.
    Là  tu peux lire un peu plus sur l'objet que tu viens de créer et en bas tu as les méthodes "delegate" disponibles.Dont speechSynthesizer:willSpeakWord:ofString: qui te prévient chaque fois qu'un mot va être prononcé.
    Tu recopies la méthode avec ses arguments et tu reviens la coller et l'implémenter dans AppController. Elle doit seulement incrémenter fido de 1. Tout est dans le livre déjà  cité pour lier fido à  ton objet progressIndicator dans IB.

    Pour savoir combien de mots à  prononcer dans ta phrase tu as "components separated by string" dans NSString dont je t'invites aussi à  regarder la doc. Comme ça tu peux le définir comme valeur maximale à  ton NSProgressIndicator (ça tu peux le faire dans awakeFromNib ou n'importe quand avant de lancer la lecture).

    Pas de raisons que ça marche, pas tellement de lignes de code à  écrire non plus.
    Mais il faut avoir bien lu ce livre et fait/refait les exercices. Encore maintenant chaque fois que je le relis j'y trouve des choses !

  • schlumschlum Membre
    01:04 modifié #23
    dans 1244237358:

    Heu sans vouloir être méchant... si tu ne comprends pas ça, y'a de sacrés concepts de base à  revoir, parce que ce genre de trucs c'est pourtant assez simple... alors si t'en es là , pour le reste tu risques fort de galérer...
    Suis plutôt les tutos classique, relis les bouquins (genre Hillegass) qui expliquent les bases, relis les docs Apple (Programming Topics) sur les delegates, le fonctionnement d'une appli Cocoa en général... avant d'essayer d'aller plus loin, parce que sinon je vois pas ce qu'on peut te dire d'autre...


    +1... et commence par le C parce que là , tu ne sais même pas ce que c'est qu'une callback, c'est embêtant.
Connectez-vous ou Inscrivez-vous pour répondre.