2011-08-10 10 views
6

Estoy tratando de aprender el Objetivo C y tengo un error en el código de una de mis lesiones y no sé cómo resolverlo. Código:setDelegate: uno mismo genera un indicador de precaución

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

Desde [speechSynth setDelegate: auto]; Me sale el error: Enviar 'AppController *' al parámetro de tipo incompatible 'id < NSSpeechSynthesizerDelagate>'. El programa se compila con un indicador de precaución y parece que se ejecuta correctamente. He comparado mi código con el código del autor y no encuentro diferencias, y ninguna de mis búsquedas ha indicado que deba obtener un error en esta línea. El libro fue escrito para Xcode 3 y estoy usando Xcode 4.0.2.

Cualquier sugerencia o señalarme en la dirección correcta sería muy apreciada. Gracias.

+0

¿Está implementando el protocolo de delegado en el encabezado? –

+0

¿Su AppController implementa el NSSpeechSynthesizerDelegate? – Perception

Respuesta

14

Xcode le advierte que el método setDelegate espera una instancia de una clase que ha implementado el protocolo NSSpeechSynthesizerDelagate. Ahora lo tienes, pero probablemente has olvidado declarar que lo has hecho. En su declaración de clase, cambie

@class AppController : NSObject 

a

@class AppController : NSObject<NSSpeechSynthesizerDelegate> 

para decirle al mundo "Obedezco NSSpeechSynthesizerDelegate!", Y el silencio de la advertencia. Nunca se sabe, es posible que te avisen que te olvidaste de implementar algunos métodos delegados no opcionales y te ahorras un error molesto en algún momento.  

+0

Voy a hacer +1 en cuanto tenga votos nuevamente, en 46 minutos. –

+0

@adam Gracias por su respuesta y el ejemplo, eso funcionó. Nunca hubiera averiguado cómo hacer la codificación en ese formato por mi cuenta. No estaba en el libro ni en los ejemplos en línea de los autores. Tuve al delegado unido a la vista de tabla para poder acceder a las voces y pensé que eso era todo lo que necesitaba. –

2

Cuando lanza el objeto automático, el mensaje de advertencia desaparece.

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