objective c - setValue: forUndefinedKey: esta clase no es un valor clave que cumple con la codificación para la clave
objective-c xcode (20)
¡Este error es algo más!
Así es como lo solucioné. Estoy usando la versión 6.1.1 de xcode y usando swift. Recibí este error cada vez que mi aplicación intentaba realizar un cambio para pasar a la siguiente pantalla. Aquí lo que hice.
- Comprueba que el botón estaba conectado a la acción correcta. (Este no era el problema, pero aún así es bueno verificarlo)
- Compruebe que el botón no tenga acciones o salidas adicionales que pueda haber creado por error. (Este no era el problema, pero aún así es bueno verificarlo)
- Verifique los registros y asegúrese de que todos los botones en la PANTALLA SIGUIENTE tengan las acciones correctas, y si hay algún cambio, asegúrese de que tengan un identificador único. (Este fue el problema)
- Uno de los segmentos no tenía un identificador único
- Uno de los botones tenía una acción y dos salidas que creé por error.
Elimine los puntos de venta adicionales y asegúrese de que los segmentos a la siguiente pantalla tengan identificadores únicos.
Aclamaciones,
Esta pregunta ya tiene una respuesta aquí:
Estoy creando un inicio de sesión para ver tickets de soporte. La primera vista es la vista de ticket, y si no está conectado lo empuja a la pantalla de inicio de sesión. Sin embargo, yo recibo esto:
Soporte [3209: 18e03] * Aplicación de finalización debido a una excepción no detectada ''NSUnKeyKeyException'', razón: ''[setValue: forUndefinedKey:]: esta clase no es un valor clave que cumple con la codificación para la clave LoginScreen.'' *
Primera pila de llamadas tiro: (0x1f17012 0x1634e7e 0x1f9ffb1 0x10e1711 0x1062ec8 0x10629b7 0x108d428 0x7990cc 0x1648663 0x1f1245a 0x797bcf 0x65ce37 0x65d418 0x65d648 0x65d882 0x669235 0x8683d2 0x6664f3 0x666777 0x6667b7 0x9d1fe2 0x9c3ad9 0x65e422 0x2b15 0x65f753 0x65fb2f 0x661286 0x65fe3f 0x592910 0x592895 0x5926e5 0x1edfafe 0x1edfa3d 0x1ebd7c2 0x1ebcf44 0x1ebce1b 0x22aa7e3 0x22aa668 0x57c65c 0x1f0d 0x1e35) libc + + abi.dylib: terminar llamado lanzando una excepción
Aquí está mi código para LoginScreen.m
#import "UIAlertView+error.h"
#import "LoginScreen.h"
#import "API.h"
#include <CommonCrypto/CommonDigest.h>
#define sayWhat @"REMOVEDFORSECURITY"
@implementation LoginScreen
-(void)viewDidLoad {
NSLog(@"Found me!");
[super viewDidLoad];
//focus on the username field /show keyboard
[fldUsername becomeFirstResponder];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
-(IBA
ction)btnLoginRegisterTapped:(UIButton*)sender {
if (fldUsername.text.length < 4 || fldPassword.text.length < 4){
[UIAlertView error:@"Enter username and password over 4 chars each."];
return;
}
//very basic encryption called "salting"
NSString* saltedPassword = [NSString stringWithFormat:@"%@%@", fldPassword.text, sayWhat];
//prep the hashed storage
NSString* hashedPassword = nil;
unsigned char hashedPasswordData[CC_SHA1_DIGEST_LENGTH];
//actually hash this
NSData *data = [saltedPassword dataUsingEncoding: NSUTF8StringEncoding];
if (CC_SHA1([data bytes], [data length], hashedPasswordData)){
hashedPassword = [[NSString alloc] initWithBytes:hashedPasswordData length:sizeof(hashedPasswordData) encoding:NSASCIIStringEncoding];
} else {
[UIAlertView error:@"Password can''t be sent"];
return;
}
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
fldUsername.text, @"username",
hashedPassword, @"password", nil];
//here is the web call finally!
[[API sharedInstance] commandWithParams:params
onCompletion:^(NSDictionary *json){
//returned result
NSDictionary* res = [[json objectForKey:@"result"] objectAtIndex:0];
if([json objectForKey:@"error"]==nil && [[res objectForKey:@"userid"] intValue]> 0) {
//success
} else {
//error''
[UIAlertView error:[json objectForKey:@"error"]];
}
}];
}
@end
y LoginScreen.h
#import <UIKit/UIKit.h>
@interface LoginScreen : UIViewController {
//the login form fields
IBOutlet UITextField* fldUsername;
IBOutlet UITextField* fldPassword;
}
//action for when either button is pressed
-(IBAction)btnLoginRegisterTapped:(id)sender;
@end
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="2.0" toolsVersion="2844" systemVersion="12C60" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="A8c-eR-geg">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="1930"/>
</dependencies>
<scenes>
<!--Tickets View - View Tickets-->
<scene sceneID="aIJ-Wx-2Yy">
<objects>
<viewController title="View Tickets" id="T0P-Bi-31w" customClass="TicketsView" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="4zZ-I2-ltX">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="You Made It" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Fbu-Sr-Mgf">
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="Fbu-Sr-Mgf" firstAttribute="top" secondItem="4zZ-I2-ltX" secondAttribute="top" constant="138" id="QBp-qM-fKP"/>
<constraint firstItem="Fbu-Sr-Mgf" firstAttribute="leading" secondItem="4zZ-I2-ltX" secondAttribute="leading" constant="115" id="goO-5h-RZK"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="vu4-JX-C3v"/>
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
<connections>
<segue destination="TOB-FA-Ss4" kind="modal" identifier="ShowLogin" id="dJH-ge-8CV"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="aSa-2G-5fx" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-518" y="-841"/>
</scene>
<!--Login Screen - Login-->
<scene sceneID="6iZ-QL-7ID">
<objects>
<viewController title="Login" id="TOB-FA-Ss4" customClass="LoginScreen" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="w9e-4U-cwC">
<rect key="frame" x="0.0" y="64" width="320" height="504"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Blue Label Hosting Login" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="SuD-JI-L2T">
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Username" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="NeI-zB-U8Y">
<constraints>
<constraint firstAttribute="height" constant="31" id="BlH-cG-Jdh"/>
<constraint firstAttribute="width" constant="208" id="Osb-tj-fjn"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits"/>
</textField>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Password" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="4Fi-NX-kli">
<constraints>
<constraint firstAttribute="height" constant="31" id="X3j-X2-ton"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" secureTextEntry="YES"/>
</textField>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="5o5-83-KbW">
<constraints>
<constraint firstAttribute="height" constant="36" id="Afu-6h-uru"/>
<constraint firstAttribute="width" constant="161" id="Ef5-df-Jmp"/>
</constraints>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<state key="normal" title="Login">
<color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
</state>
<state key="highlighted">
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</state>
<connections>
<action selector="btnLoginRegisterTapped:" destination="w9e-4U-cwC" eventType="touchUpInside" id="Wgb-L8-sAJ"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<constraints>
<constraint firstItem="NeI-zB-U8Y" firstAttribute="top" secondItem="SuD-JI-L2T" secondAttribute="bottom" constant="8" symbolic="YES" type="default" id="0Pv-zM-WId"/>
<constraint firstItem="4Fi-NX-kli" firstAttribute="top" secondItem="NeI-zB-U8Y" secondAttribute="bottom" constant="8" symbolic="YES" type="default" id="2Sw-m8-LND"/>
<constraint firstItem="4Fi-NX-kli" firstAttribute="trailing" secondItem="NeI-zB-U8Y" secondAttribute="trailing" type="default" id="88O-VQ-qut"/>
<constraint firstItem="SuD-JI-L2T" firstAttribute="centerX" secondItem="NeI-zB-U8Y" secondAttribute="centerX" type="default" id="Qu9-PG-YWz"/>
<constraint firstItem="4Fi-NX-kli" firstAttribute="centerX" secondItem="5o5-83-KbW" secondAttribute="centerX" type="default" id="RAm-sI-Z3u"/>
<constraint firstItem="5o5-83-KbW" firstAttribute="top" secondItem="w9e-4U-cwC" secondAttribute="top" constant="128" id="UTG-NS-bx4"/>
<constraint firstItem="SuD-JI-L2T" firstAttribute="top" secondItem="w9e-4U-cwC" secondAttribute="top" constant="20" symbolic="YES" type="default" id="iaC-Ex-EBa"/>
<constraint firstItem="SuD-JI-L2T" firstAttribute="centerX" secondItem="w9e-4U-cwC" secondAttribute="centerX" type="default" id="oWP-Gp-Pi5"/>
<constraint firstItem="4Fi-NX-kli" firstAttribute="leading" secondItem="NeI-zB-U8Y" secondAttribute="leading" type="default" id="oxE-WD-fVc"/>
</constraints>
<connections>
<outlet property="fldPassword" destination="4Fi-NX-kli" id="4eb-YW-8YI"/>
<outlet property="fldUsername" destination="NeI-zB-U8Y" id="Ds4-XS-iqW"/>
</connections>
</view>
<simulatedNavigationBarMetrics key="simulatedTopBarMetrics" prompted="NO"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="FL3-Yk-JbH" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-84" y="-349"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="fJ6-wq-4Tj">
<objects>
<navigationController id="A8c-eR-geg" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" id="bnk-dD-E4j">
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="T0P-Bi-31w" kind="relationship" relationship="rootViewController" id="3jA-WY-c3V"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="lTO-TW-owb" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-971" y="-910"/>
</scene>
</scenes>
<classes>
<class className="LoginScreen" superclassName="UIViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/LoginScreen.h"/>
<relationships>
<relationship kind="action" name="btnLoginRegisterTapped:"/>
<relationship kind="outlet" name="fldPassword" candidateClass="UITextField"/>
<relationship kind="outlet" name="fldUsername" candidateClass="UITextField"/>
</relationships>
</class>
<class className="NSLayoutConstraint" superclassName="NSObject">
<source key="sourceIdentifier" type="project" relativePath="./Classes/NSLayoutConstraint.h"/>
</class>
<class className="TicketsView" superclassName="UIViewController">
<source key="sourceIdentifier" type="project" relativePath="./Classes/TicketsView.h"/>
</class>
</classes>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
</document>
En mi caso tengo la descripción de IBOutlet UILabel * en .h, era con amarillo /! / - "no se sintetizará" , según recuerdo. No sé qué es y por qué solo esta etiqueta.
Pero tengo este bloqueo y error como el anterior. Deleted * description y recreate * description2. Sin fallas en el resultado.
Encontré este mismo problema hoy. Como se sugiere en esta respuesta , el problema era un xib no limpio. En mi caso, el xib sucio era el resultado de actualizar un xib que estaba siendo cargado por algo distinto al controlador de vista al que estaba asociado.
Xcode me permitió crear y llenar una nueva tienda y conectarlo al propietario del archivo a pesar de que lo conecté explícitamente a la fuente del controlador de visualización correcto. Aquí está el código generado por Xcode:
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File''s Owner" customClass="LoginViewController"]]>
<connections>
<outlet property="hostLabel" destination="W4x-T2-Mcm" id="c3E-1U-sVf"/>
</connections>
</placeholder>
Cuando ejecuté mi aplicación, se bloqueó con el mismo error de not key value coding-compliant
. Para corregir el problema, eliminé la salida del propietario del archivo en Interface Builder y lo conecté explícitamente al objeto del controlador de vista en el contorno izquierdo en lugar de al código en el editor del asistente.
Esto generalmente significa que algo está intentando acceder a @property "givenName" .
Si estaba haciendo algo con Interface Builder(IB)
, la causa habitual es que usted:
- borró esa propiedad de la clase, pero aún no eliminó las conexiones en IB
- O bien, tiene un objeto Propietario de archivo configurado en la clase incorrecta (verifique las propiedades, dependiendo de la versión de xcode que esté utilizando;
- para encontrar el nombre de clase se establece como. Probablemente copie / pegue un archivo NIB, y no haya cambiado este campo en el NIB), y haya conectado un punto de venta para esa clase, pero su propietario real del archivo es algo diferente
Esto me sucedió en el siguiente escenario:
Creé un segundo proyecto en mi área de trabajo, elegí "Aplicación de vista única" para la plantilla.
Luego fui a Interface Builder (guión gráfico principal de iPhone), agregué un UISwitch
a la vista principal y lo conecté al controlador de vista a través de un IBOutlet
y un IBAction
( -valueChanged:
.
En el lanzamiento, la aplicación falla con la excepción mencionada en la pregunta. Si elimino el interruptor de la vista, funciona.
Después de una inspección cuidadosa, me di cuenta de que controlaba-arrastraba las conexiones al ViewController.h
de otro proyecto en el mismo espacio de trabajo. El conjunto "Automático" del Editor Asistente de Interface Builder (también conocido como icono de cofre Tuxedo ) eligió como "contraparte" el archivo incorrecto (con el nombre correcto).
Espero que esto ayude a alguien, especialmente porque las plantillas de proyecto ''Aplicación de vista única'' y ''SpriteKit Game'' (en mi caso) crean una clase de controlador de vista predeterminada llamada "ViewController".
Me encontré con un error similar al crear una clase de vista personalizada, eso fue porque de alguna manera uno de los enchufes se conectó dos veces en el archivo XIB (creo que controlé inicialmente arrastré el control directamente al código, pero este último control se arrastró nuevamente desde el Propietario del archivo). Abrí el archivo XIB y eliminé uno de ellos, después de eso todo funcionó bien. Espero que esto ayude.
Obtuve este en un PickerView de todos los lugares. El mensaje de error fue nombrar el problema con "queuePicker" al principio del mensaje. Fue causada por un punto de referencia anterior que no fue válido por mucho tiempo después de que agregué un componente y cambié el nombre del NSArray original por otro que no sea queuePicker. CNTL + clic en su objeto StoryBoard le da las conexiones. Hice clic en la "x" junto a ViewController para queuePicker en Referencing Outlets, hice una nueva conexión y viola, no más bloqueos.
Para mí cambié una llamada para mi encabezado de vista de colección donde estaba registrando la punta para registrar la clase. Eso lo solucionó
Porque es porque no tiene 2 funciones
@implementation CellTableView
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
return [self init];
}
- (void)awakeFromNib {
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
}
@end
Probablemente esté estableciendo un valor para una clave en alertView, que no está permitido. La clave es en este caso LoginScreen
. No veo ninguna llamada a setValue()
, así que supongo que está en otro lugar del código.
Si tiene diferentes archivos de storybord y si tiene referencias de puntos de venta sin la creación de puntos de venta en sus archivos de encabezado, entonces simplemente elimine las conexiones haciendo clic derecho en el propietario de los archivos.
Propietario de archivos-> haga clic derecho-> eliminar la conexión no deseada allí.
Repasa esto para una explicación clara. ¿Qué significa esto? "''NSUnKeyKeyException'', razón: ... esta clase no cumple con el código de clave para la clave X"
Tales excepciones inexplicables a menudo son el resultado de un archivo xib
sucio. Abra el xib
en xcode, seleccione Propietario de archivo y haga clic en "Inspector de conexión" (flecha superior derecha), para ver todos los puntos de venta a la vez. ¡Busca !
s que indica una salida faltante.
Tuve este problema porque no estaba usando StoryBorad, y en las propiedades del proyecto -> Desplegar información -> Interfaz principal era el nombre del Main Xib.
Eliminé el valor en la Interfaz principal y resolví el problema.
Tuve esto y revisé todo y no vi ningún problema, pero finalmente recordé intentar Limpiar y borrar Datos Derivados ¡ y eso lo resolvió!
Tuve que eliminar todos los objetos y volver a agregarlos. Esto parece haber solucionado el problema.
Tuve un problema similar al crear TableCell personalizado. El problema fue que configuré FileOwner en mi clase personalizada y luego conecté los puntos de venta.
FileOwner debe seguir siendo NSObject.
Tuve un problema similar, pero estaba usando initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
explícitamente usando el nombre de la clase como la cadena pasada (sí, forma incorrecta).
Terminé borrando y volviendo a crear el controlador de vista usando un nombre ligeramente diferente, pero olvidé cambiar la cadena especificada en el método, así que mi versión anterior todavía se usaba, ¡aunque estaba en la papelera!
Probablemente usaré esta estructura en el futuro como se sugiere en: ¿Está pasando dos parámetros nulos a initWithNibName: bundle: mala práctica del método (es decir, inseguro o más lento)?
- (id)init
{
[super initWithNibName:@"MyNib" bundle:nil];
... typical initialization ...
return self;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
return [self init];
}
¡Espero que esto ayude a alguien!
Ve a la pestaña de puntos de corte de Xcode. Use el botón en la parte inferior para agregar un punto de interrupción de excepción. Ahora verá qué código está invocando setValue: forKey: y la pila asociada. Con suerte que te señalará directamente la fuente del problema.
Es extraño que su clase sea LoginScreen, pero el error indica que alguien está usando "LoginScreen" como clave. Verifique que LoginScreen.m sea parte de su objetivo.
Nota al pie: con Swift surge un problema común si cambias el nombre de una clase (por lo tanto, cambias el nombre en todas partes en tu código). Storyboard tiene problemas con esto, y generalmente tiene que volver a arrastrar cualquier conexión que involucre esa clase. Y, en particular, vuelva a ingresar el nombre de la clase en cualquier lugar utilizado en la pestaña IdentityInspector a la derecha. (En el ejemplo de la imagen, mal deleturé deliberadamente el nombre de la clase. Pero a menudo sucede lo mismo cuando cambia el nombre de una clase: aunque es aparentemente correcto en IdentityInspector , debe ingresar el nombre nuevamente, se autocompletará correctamente y estará listo para ir.)
Verifica tus conexiones en Interface Builder. Probablemente se esté refiriendo a un IBOutlet
o IBAction
inexistente.
Gracias chicos. Resolví este problema con tu ayuda. Por lo tanto, espero que esta captura de pantalla sea útil para las personas que tienen el mismo problema.