2011-08-10 85 views
6

我正在嘗試學習Objective C,並在代碼中出現錯誤,並且我不知道如何解決它。 代碼:setDelegate:自我生成警告標誌

// 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; 
    } 

From [speechSynth setDelegate:self];我得到錯誤:發送'AppController *'到不兼容類型的參數'id < NSSpeechSynthesizerDelagate>'。 該程序與警告標誌編譯並似乎運行正常。我將我的代碼與作者的代碼進行了比較,可以發現沒有區別,我的搜索沒有表明我應該在此行上發生錯誤。這本書是爲Xcode 3編寫的,我使用的是Xcode 4.0.2。

任何建議或指引我在正確的方向將不勝感激。謝謝。

+0

您是否在頭中實現委託協議? –

+0

你的AppController是否實現了NSSpeechSynthesizerDelegate? – Perception

回答

14

Xcode警告你,setDelegate方法需要一個實現了NSSpeechSynthesizerDelagate協議的類的實例。現在,你有,但你可能已經忘記宣佈你已經擁有了。在你的類聲明,改變

@class AppController : NSObject 

@class AppController : NSObject<NSSpeechSynthesizerDelegate> 

告訴世界 「我服從NSSpeechSynthesizerDelegate!」,和沉默的警告。你永遠不知道 - 你可能會被警告,你忘記了實現一些非可選的委託方法,併爲自己節省了一個煩人的bug。  

+0

我會在46分鐘內再次投票時立即爲此+1。 –

+0

@adam非常感謝您的回答,以及有效的例子。我從來沒有想過如何以我自己的格式編碼。這不在書中或作者在線的例子。我確實讓代表與桌面視圖保持一致,這樣我就可以獲得我所需要的言論和思想。 –

2

當您投射自我對象時,則警告消息消失。

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