2011-08-10 12 views
6

Próbuję uczyć się Cel C i mam błąd w kodzie dla jednej z moich lekcji i nie wiem jak to rozwiązać. Kod:setDelegate: self generuje flagę ostrożność

// AppController.m 

#import "AppController.h" 

@implementation AppController 

- (id)init 
    { 
     [super init]; 
     speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:nil]; 
     [speechSynth setDelegate:self]; 
     voiceList = [[NSSpeechSynthesizer availableVoices] retain]; 
     Return self; 
    } 

Z [speechSynth setDelegate Samodzielny]; Wystąpił błąd: Wysyłanie "AppController *" do parametru niezgodnego typu 'id < NSSpeechSynthesizerDelagate>'. Program kompiluje się z flagą ostrzegawczą i wydaje się działać poprawnie. Porównałem mój kod z kodem autora i nie znajduję żadnych różnic, a żadne z moich wyszukiwań nie wskazało, że powinienem otrzymać błąd w tej linii. Książka została napisana dla Xcode 3 i używam Xcode 4.0.2.

Wszelkie sugestie lub skierowanie mnie we właściwym kierunku zostaną bardzo docenione. Dzięki.

+0

Czy implementujesz protokół delegata w nagłówku? –

+0

Czy Twój AppController implementuje NSSpeechSynthesizerDelegate? – Perception

Odpowiedz

14

Xcode ostrzega, że ​​metoda setDelegate oczekuje wystąpienia klasy, która zaimplementowała protokół NSSpeechSynthesizerDelagate. Teraz masz, ale prawdopodobnie zapomniałeś oświadczyć, że masz. W swojej deklaracji klasy, zmień

@class AppController : NSObject 

do

@class AppController : NSObject<NSSpeechSynthesizerDelegate> 

powiedzieć światu "jestem posłuszny NSSpeechSynthesizerDelegate!" I wyciszyć ostrzeżenia. Nigdy nie wiadomo - możesz zostać ostrzeżony, że zapomniałeś wprowadzić jakieś nieobowiązkowe metody delegowania i uratować sobie irytujący błąd gdzieś w dole.  

+0

Będę dawał +1, gdy tylko będę głosował ponownie, w 46 minut. –

+0

@adam Dziękujemy za odpowiedź i przykład, który zadziałał. Nigdy bym sobie nie poradził, jak samemu kodować w tym formacie. Nie było to w książce ani w autorskich przykładach on-line. Miałem delegata przywiązanego do widoku stołu, tak że mogłem uzyskać dostęp do głosów dla przemówień i myśli, które były wszystkim, czego potrzebowałem. –

2

Podczas rzutowania obiektu własnego komunikat ostrzegawczy znika.

[speechSynth setDelegate:(id <NSSpeechSynthesizerDelegate>) self];