2008-09-05 24 views
18

Escribo mi primera aplicación para iPhone, así que no me he dado cuenta de que hay mucho para depurar. Esencialmente mi aplicación muestra una imagen y cuando se toca reproduce un sonido corto. Al compilar y crear el proyecto en XCode, todo se desarrolla correctamente, pero cuando la aplicación se ejecuta en el simulador de iPhone, se bloquea.Aplicación para iPhone que se bloquea con NSUnknownKeyException setValue: forUndefinedKey:

me sale el siguiente error:

Application Specific Information: 
iPhone Simulator 1.0 (70), iPhone OS 2.0 (5A331) 
*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason: '[<UIView 0x34efd0> setValue:forUndefinedKey:]: this class is not key value 
coding-compliant for the key kramerImage.' 

kramerImage aquí es la imagen que estoy utilizando para el fondo.

No estoy seguro de qué significa NSUnknownKeyException o por qué la clase no es clave con codificación de valor para la clave.

Respuesta

22

(Esto no es realmente específico de iPhone; lo mismo sucederá en el cacao normal).

NSUnknownKeyException es un error común al usar Key-Value Coding para acceder a una clave que el objeto no tiene.

Las propiedades de la mayoría de los objetos de cacao se pueden acceder directamente a:

[@"hello world" length] // Objective-C 1.0 
@"hello world".length  // Objective-C 2.0 

O a través de valores-clave Codificación:

[@"hello world" valueForKey:@"length"] 

me gustaría conseguir un NSUnknownKeyException si utilicé la siguiente línea:

[@"hello world" valueForKey:@"purpleMonkeyDishwasher"] 

porque NSString no tiene una propiedad (clave) llamada 'purpleMonkeyDishwasher'.

Algo en su código está tratando de establecer un valor para la clave 'kramerImage' en una UIView, que (al parecer) no admite esa clave. Si está utilizando Interface Builder, podría ser algo en su plumín.

Encuentra dónde se está usando 'kramerImage', e intenta rastrearlo desde allí.

+2

Recibo este error, y tiene algo que ver con interfacebuilder, pero no sé cómo solucionarlo. – bentford

+1

Gracias por eso - otro desperdicio de 3 horas finalmente arreglado. :) –

+0

Estaba teniendo este problema en la situación en que había copiado archivos de un proyecto a otro. Mi xib se refiere al nombre de clase equivocado. Esta respuesta me dio suficiente información para un momento eureka, así que gracias. – Grumdrig

10

Además, cuando cambie el nombre de una vista, no olvide eliminar la referencia en el propietario del archivo. También puede provocar este error.

+1

+1 esto me pasó a mí . Cambié el nombre de la variable para mi MKMapView y, de repente, ¡BAM! NSUknownUknownKeyException. – ladookie

+0

Storyboard tenía un botón vinculado a nada que causaba el error de KeyValue. Esto resolvió mi problema. ¡Gracias! –

8

Aquí hay uno donde obtendrá este error y cómo solucionarlo. Lo estaba obteniendo cuando cargaba un plumín que solo tenía una TableViewCell personalizada. Usé IB para construir un xib que acababa de tener el propietario del archivo, el primer respondedor y el TableViewCell. El TableViewCell acaba de tener 4 UILabels que coinciden hasta una clase con 4 IBOutlet UILabels llamada rootCell. Cambié la clase de TableViewCell para que fuera rootCell. Funcionó bien hasta que un hecho un par de cambios y de repente me estaba poniendo la setValue: forUndefinedKey: cuando estaba solo crear instancias de la clase después de cargarlo desde una punta:

NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"rootCell-iPad" owner:self options:nil]; 

    cell = [nib objectAtIndex:0]; 

que falló en la primera línea, cuando el plumín estaba tratando de cargar. Después de un tiempo, noté que estaba tratando de hacer coincidir las etiquetas de IBOutlet con el controlador raíz, NO con la clase rootCell. Esa fue mi información. Lo que hice mal fue cambiar inadvertidamente el propietario del archivo a la clase rootCell. Cuando lo cambié de nuevo a NSObject, no intenté hacer coincidir el delegado (controlador raíz) al cargar. Por lo tanto, si está haciendo lo anterior, haga del propietario del archivo un NSObject, pero haga de UITableCell la clase que desee.

+0

+1 Y tenga en cuenta a mí mismo y a cualquier otra persona que _siempre_ olvide esto: cuando use loadNibNamed: owner: options :, el propietario del archivo debe ser NSObject, la vista principal debe ser su tipo de clase, y todas las salidas deben estar conectadas a la vista , _no_ el propietario del archivo. – Echelon

+0

Gracias Owen, luché con exactamente la misma situación. Resuelto como se describe. ¡Muchas gracias! – Khiet

0

Parece que está haciendo

@interface MyFirstIphoneAppViewController : UIViewController<> { 
    UIImageView *InitialkramerImage; 
} 
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage; 

Luego, después de que la síntesis de imageview, Al abrir "MyFirstIphoneAppViewController.xib" en Interface Builder, usted está tomando un Ver la imagen de la herramienta (menú)/Biblioteca de enlace que den salida a 'InitialkramerImage' del propietario de archivos de "MyFirstIphoneAppViewController.xib". Luego guardaste el proyecto. Pero después de eso, puede cambiar el nombre de la variable de salida "InitialkramerImage" por "kramerImage". Así que, después de hacer esto

@interface MyFirstIphoneAppViewController : UIViewController<> { 
    UIImageView *kramerImage; 
} 
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage; 

y guardar el proyecto cuando se ejecuta, No hay existencia de la salida de "InitialkramerImage" en el "MyFirstIphoneAppViewController.xib". Por lo tanto, cuando se ejecuta el proyecto, no habrá salida de referencia de Imageview a la 'kramerImage' y

"For displaying the view, UIViewController will try to find the outlet to "InitialkramerImage" which is not existing."

lo tanto, será lanzar el "NSUnknownKeyException".

You can check the missing outlet by opening the nib(.xib) file then right clicking on the 'Files Owner' of that.

2

Tuve el mismo problema hoy. No tenía la clase correcta especificada para el controlador de vista en mi controlador de navegación. Esto sucederá a menudo si no especifica la clase correcta para sus vistas en Interface Builder.

También recibirá problemas con el selector no válido. ¡Siempre revisa tus clases y conexiones de Interface Builder!

+0

Gracias. Tenía la clase especificada correctamente en IB, pero había una falta de coincidencia entre mi controlador y la punta que especifiqué en initWithNibName: - Debería haber revocado mis privilegios de copiar y pegar. – masty

+0

Simplemente regrese al dojo de iOS y practique su copia + paste-fu. – gonzobrains

0

Si ha hecho este código en otro lugar y tiene un archivo zip/comprimido, intente extraerlo nuevamente. Puede funcionar. No sé por qué pero siento que es un problema de extracción.

o puede intentar cambiar la IBOutlet a kramerImage y vincularla de nuevo en NIB.

2

Tuve esta situación y resulta incluso después de encontrar todas las instancias de la variable y borrarlas, mi aplicación aún se colgó. Aquí está lo que sucedió ... Creé otra instancia de una variable de un campo de texto de mi XIB en mi viewController.h pero me di cuenta de que ya no la necesitaba y la eliminé. Resultó que mi programa vio eso y siguió tratando de usarlo en el programa, así que en el futuro si esto sucede en cualquier otro lugar, ingresa en tu XIB. Haz clic derecho en el botón o en el campo de texto, etc. y elimina cualquier variable adicional no utilizada.

2

Así es como resolví la mía, en el constructor de interfaces, haga clic derecho en View Controller, debería haber un signo de exclamación en el método de salida o acción faltante. Encuentra y elimina todas las referencias y eso lo resolvió.

Esto sucedió porque eliminé el método de acción en el archivo .m.

Cuestiones relacionadas