[Résolu]Delegate NSSpeechSynthesizer

LiaghtLiaght Membre
avril 2010 modifié dans Objective-C, Swift, C, C++ #1
Bonjour,

Après une recherche infructueuse j'ouvre un nouveau sujet à  propos des différences de 10.6.

Je suis actuellement en train d'étudier le livre d'[url=http://www.bignerdranch.com/book/cocoa®_programming_for_mac®_os_x_3rd_edition]Aaron Hillegass[/url] Programmation Cocoa sous Mac OS X, j'en suis au chapitre 6 et je bloque sur la délégation. Sur le site de l'auteur (cliquez sur le nom de l'auteur, ci-dessus), il est dit dans la partie Errata que depuis Snow Leopard, l'introduction de Objective-C avait modifié quelque peu le fonctionnement des delegate. Malgré ce que conseille l'auteur, j'obtiens à  la compilation du projet :

Cannot find protocol declaration for 'NSSpeechSynthesizerDelegate' in /SpeakLineTwo/AppController.h


Voici mon code :

AppController.h :

#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface AppController: NSObject &lt;NSSpeechSynthesizerDelegate&gt; {<br />	IBOutlet NSTextField *textField;<br />	IBOutlet NSButton *startButton;<br />	IBOutlet NSButton *stopButton;<br />	NSSpeechSynthesizer *speechSynth;<br />}<br />- (IBAction)sayIt:(id)sender;<br />- (IBAction)stopIt:(id)sender;<br /><br />@end


AppController.m :

#import &quot;AppController.h&quot;<br /><br />@implementation AppController<br /><br />- (id)init<br />{<br />	[super init];<br />	<br />	NSLog(@&quot;Initialisation&quot;);<br />	<br />	speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:nil];<br />	[speechSynth setDelegate:self];<br />	<br />	return self;<br />}<br /><br />- (IBAction)sayIt:(id)sender<br />{<br />	NSString *string = [textField stringValue];<br />	<br />	if ([string length] == 0) {<br />		NSLog(@&quot;La chaà®ne de %@ est vide.&quot;, textField);<br />		<br />		return;<br />	}<br />	<br />	[speechSynth startSpeakingString:string];<br />	NSLog(@&quot;Lecture de : %@&quot;, string);<br />	[startButton setEnabled:NO];<br />	[stopButton setEnabled:YES];<br />}<br /><br />- (IBAction)stopIt:(id)sender<br />{<br />	NSLog(@&quot;Arrêt en cours&quot;);<br />	[speechSynth stopSpeaking];<br />}<br /><br />- (void)speechSynthesizer:(NSSpeechSynthesizer *)sender <br />		didFinishSpeaking:(BOOL)complete<br />{<br />	[startButton setEnabled:YES];<br />	[stopButton setEnabled:NO];<br />	NSLog(@&quot;Fin = %@&quot;, complete);<br />}<br />@end


Je n'arrive pas à  résoudre l'erreur, si j'en suis la logique je devrais inclure le fichier d'en-tête contenant le delegate mais comme il est inclut dans la class NSSpeechSynthesizer et que je l'utilise je me dis que c'est pas ça...

Merci.

Réponses

  • zoczoc Membre
    05:13 modifié #2
    Bien s'assurer que le "BaseSDK" du projet est bien le SDK 10.6. Parce que si tu compiles sous Snow Leopard avec le SDK MacOS X 10.5, le protocole NSSpeechSynthesizerDelegate n'existe tout simplement pas.
  • LiaghtLiaght Membre
    05:13 modifié #3
    Merci, j'ai tout mis en 10.6 et ça fonctionne en revanche j'ai une erreur dans l'execution de monapplication :

    Program received signal:  “EXC_BAD_ACCESS”.
    sharedlibrary apply-load-rules all


    Je ne sais pas comment faire pour trouver l'erreur. Il semblerait qu'il faille utiliser les break point mais j'en pas saisis la subtilité.
  • zoczoc Membre
    avril 2010 modifié #4
    Un forum n'est certainement pas très adapté pour donner un cours de debuggage et d'utilisation de GDB (et de son interface graphique intégrée à  XCode).


    Un "point d'arrêt", grosso modo, cela correspond à  un endroit dans le programme où l'on veut s'arrêter temporairement (le programme se met en pause) afin de pouvoir observer le contenu des variables et ainsi s'assurer que le programme fonctionne correctement ou déterminer les raisons d'un plantage.


    Autrement dit, si tu penses qu'un crash se produit quand le programme exécute la ligne de code "n", alors tu mets un point d'arrêt sur la ligne "n-1". Quand cette ligne est exécutée, le programme se met en pause et tu peux examiner le contexte d'exécution courant (valeur des variables locales et globales, contenu de la pile d'exécution, etc...).


  • mpergandmpergand Membre
    05:13 modifié #5
    - (void)speechSynthesizer:(NSSpeechSynthesizer *)sender
    didFinishSpeaking:(BOOL)complete
    {
    [startButton setEnabled:YES];
    [stopButton setEnabled:NO];
    NSLog(@Fin = %", complete);
    }

  • zoczoc Membre
    05:13 modifié #6
    Ah ouais, tout simplement  :D


    J'avoue que je n'avais pas pris le temps de lire le code.

  • LiaghtLiaght Membre
    05:13 modifié #7
    dans 1272141542:

    - (void)speechSynthesizer:(NSSpeechSynthesizer *)sender
    didFinishSpeaking:(BOOL)complete
    {
    [startButton setEnabled:YES];
    [stopButton setEnabled:NO];
    NSLog(@Fin = %", complete);
    }


    Je vois pas la différence en tout cas ça fonctionne !
  • zoczoc Membre
    05:13 modifié #8
    Bah justement, ça ne devrait pas  :D


    le %@ dans ta chaine indique à  NSLog que le paramètre suivant (complete) et un objet, ce qui n'est pas le cas puisque c'est un booleen (et en Objective-C les types primitifs ne sont pas des objets). Tel que c'est écrit, ça peut "marchoter" (notamment si complete = NO), mais aussi planter...



  • LiaghtLiaght Membre
    05:13 modifié #9
    Donc un %d aurait été plus judicieux ?
  • AliGatorAliGator Membre, Modérateur
    05:13 modifié #10
    Je dirais même plus, c'est pas qu'un %d "aurait été plus judicieux", c'est que c'est ce qu'il faut mettre : sans quoi ça risque fort de planter.
  • mpergandmpergand Membre
    05:13 modifié #11
    ou bien:

    NSLog(@Fin = %@", complete ? @oui : @non);
  • AliGatorAliGator Membre, Modérateur
    05:13 modifié #12
    Lol c'est ce que j'avais répondu dans un premier temps mais j'ai effacé me disant que ça risquait de l'embrouiller plus qu'autre chose :D
  • LiaghtLiaght Membre
    05:13 modifié #13
    C'est bon j'ai compris ! Comme quoi il ne faut pas prendre le livre pour la voie de la raison. En faà®tes quand j'ai dit que ça fonctionnait comme je ne voyais pas de différence j'ai supprimé la ligne et là  ça fonctionnait ! Mais j'ai compris que le %@ ne s'utilisait qu'avec des objets et non de types basiques...

    Merci.
  • mpergandmpergand Membre
    05:13 modifié #14
    dans 1272395702:

    C'est bon j'ai compris ! Comme quoi il ne faut pas prendre le livre pour la voie de la raison.

    ???
    <br />//<br />//&nbsp; AppController.m<br />//&nbsp; SpeakLine<br />//<br />//&nbsp; Created by Aaron Hillegass on 9/13/07.<br />//&nbsp; Copyright 2007 __MyCompanyName__. All rights reserved.<br />//<br /><br />.....<br /><br />- (void)speechSynthesizer:(NSSpeechSynthesizer *)sender<br />&nbsp; &nbsp; &nbsp; &nbsp; didFinishSpeaking:(BOOL)finishedNormally<br />{<br />	NSLog(@&quot;didFinish:%d&quot;, finishedNormally);<br />	[stopButton setEnabled:NO];<br />	[startButton setEnabled:YES];<br />}
    


    J'ai pas le livre, mais dans le code source, y a bien %d  :P
  • LiaghtLiaght Membre
    05:13 modifié #15
    Je regardais la mauvaise page !  B)

    Je vais me cacher  :'(
Connectez-vous ou Inscrivez-vous pour répondre.