SetValue: forUndefinedKey: этот класс не является ключевым значением, совместимым с кодировкой для ключа
Я создаю логин для просмотра билетов на поддержку. Первое представление - это представление билета, и если вы не вошли в систему, вы подталкиваете вас к экрану входа в систему. Однако я получаю следующее:
Поддержка [3209: 18e03] * Завершение приложения из-за неперехваченного исключения "NSUnknownKeyException", причина: "[setValue: forUndefinedKey:]: этот класс не является ключевым для кодирования для ключа LoginScreen". *
Первый стек вызова броска: (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 0x592910 0x592895 0x65fe3f 0x5926e5 0x1edfafe 0x1edfa3d 0x1ebd7c2 0x1ebcf44 0x1ebce1b 0x22aa7e3 0x22aa668 0x57c65c 0x1f0d 0x1e35) libС++ abi.dylib: завершение вызова throwing exception
Вот мой код для 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
и 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>
Ответы
Ответ 1
Такие необъяснимые исключения часто являются результатом нечистого файла xib
.
Откройте xib
в xcode, выберите File Owner и щелкните "Inspector Connection" (стрелка вправо справа), чтобы сразу увидеть все розетки.
Найдите !
, который указывает на отсутствие выхода.
Ответ 2
Проверьте свои подключения в Interface Builder.
Вы, вероятно, ссылаетесь на несуществующий IBOutlet
или IBAction
.
Ответ 3
Спасибо, ребята. Я решил эту проблему с вашей помощью. Итак, я надеюсь, что этот скриншот полезен для человека, у которого такая же проблема.
Ответ 4
Перейдите на вкладку "Конечные точки Xcode". Используйте кнопку внизу, чтобы добавить контрольную точку исключения. Теперь вы увидите, какой код вызывает setValue: forKey: и связанный стек. Если повезет, вы сразу укажете на источник проблем.
Нечетно, что ваш класс - LoginScreen, но ошибка говорит, что кто-то использует "LoginScreen" в качестве ключа. Убедитесь, что LoginScreen.m является частью вашей цели.
Сноска: с Swift возникает общая проблема, если вы меняете имя класса (так что вы переименовываете его везде в своем коде). Раскадровка борется с этим, и вам обычно приходится перетаскивать любые соединения с этим классом. И, в частности, заново введите имя класса, используемого на вкладке IdentityInspector справа. (В примере с рисунком я намеренно ошибочно набрал имя класса. Но то же самое происходит при переименовании класса, , хотя это, по-видимому, правильно в IdentityInspector, вам нужно снова ввести имя, оно будет правильно автозаполнение, и вам хорошо идти.)
Ответ 5
У меня была аналогичная проблема с созданием пользовательского TableCell. Проблема заключалась в том, что я установил FileOwner в свой собственный класс, а затем подключил выходы.
FileOwner должен оставаться NSObject.
Ответ 6
У меня это было, и я просмотрел все и не видел никаких проблем, но в конце концов вспомнил, чтобы попробовать Очистить и очистить Производные данные, и это решило!
Ответ 7
У меня была аналогичная проблема, но я использовал initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
явно используя имя класса в качестве переданной строки (да, плохая форма!).
Я закончил удаление и повторное создание контроллера вида с использованием немного другого имени, но пренебрег тем, что он изменил строку, указанную в методе, поэтому моя прежняя версия все еще использовалась - даже если она была в корзине!
Я, скорее всего, буду использовать эту структуру, как было предложено в: Передает два параметра nil в initWithNibName: метод bundle: метод плохой (т.е. небезопасный или медленный)?
- (id)init
{
[super initWithNibName:@"MyNib" bundle:nil];
... typical initialization ...
return self;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
return [self init];
}
Надеюсь, это поможет кому-то!
Ответ 8
Эта ошибка - это что-то еще!
Вот как я исправил это. Я использую xcode Version 6.1.1 и использую swift. Я получал эту ошибку каждый раз, когда мое приложение пыталось выполнить segue, чтобы перейти к следующему экрану. Вот что я сделал.
- Проверено, что кнопка была подключена к правильному действию (это не проблема, но все же хорошо проверить).
- Убедитесь, что кнопка не имеет никаких дополнительных действий или выходов, которые вы, возможно, создали по ошибке. (Это не проблема, но все же хорошо проверить).
- Проверьте журналы и убедитесь, что все кнопки в NEXT SCREEN имеют правильные действия, и если есть какие-либо изменения, убедитесь, что они имеют уникальный идентификатор. (Это была проблема)
- В одном из сегментов не было уникального идентификатора
- Одна из кнопок имела действие и два выхода, которые я создал по ошибке.
Удалите все дополнительные выходы и убедитесь, что вы переходите к следующему экрану с уникальными идентификаторами.
Приветствия,
Ответ 9
У меня была эта проблема, потому что я не использовал StoryBorad, а на
Свойства проекта → Развертывание информации → Основной интерфейс - это имя основного Xib.
Я удалил значение в Main Interface и решил проблему.
Ответ 10
Я столкнулся с подобной ошибкой при создании пользовательского класса представления, потому что каким-то образом один из них дважды подключался к файлу XIB (я думаю, что изначально я управлял перетаскиванием элемента управления непосредственно в код, но последний элемент управления перетаскивался снова от владельца файла). Я открыл файл XIB и удалил один из них, после чего все работало нормально. Надеюсь, это поможет.
Ответ 11
Я получил это на PickerView всех мест. Сообщение об ошибке указывало на проблему с "queuePicker" в первом сообщении. Это было вызвано предыдущей ссылкой, которая не была долговечной после добавления компонента и переименовала исходный NSArray в нечто иное, чем queuePicker. CNTL + щелчок на объекте StoryBoard дает вам соединения. Я щелкнул "x" рядом с ViewController для queuePicker в реферирующих выходах, сделал новое соединение и альт, больше никаких сбоев.
Ответ 12
Вероятно, вы установите значение для ключа в alertView, которое не разрешено. Ключ в этом случае LoginScreen
. Я не вижу никакого вызова setValue()
, поэтому я предполагаю его где-то еще в коде.
Ответ 13
Сегодня я столкнулся с этой проблемой. Как было предложено в этом ответе, проблема была нечистым xib. В моем случае нечистый xib был результатом обновления xib, загружаемого чем-то другим, кроме контроллера представления, с которым он был связан.
Xcode позволяет мне создавать и заполнять новую розетку и связывать ее с владельцем файла, хотя я явно подключил его к источнику правильного контроллера. Здесь код, созданный Xcode:
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File Owner" customClass="LoginViewController"]]>
<connections>
<outlet property="hostLabel" destination="W4x-T2-Mcm" id="c3E-1U-sVf"/>
</connections>
</placeholder>
Когда я запустил приложение, он разбился с той же ошибкой not key value coding-compliant
. Чтобы устранить эту проблему, я удалил выход из файла Owner Owner в Interface Builder и напрямую подключил его к объекту контроллера вида на левой панели вместо кода в помощнике редактора.
Ответ 14
Это случилось со мной в следующем сценарии:
Я создал второй проект в своей рабочей области, выбрал "Single View Application" для шаблона.
Затем я перешел в интерфейс Builder (основной раскадровки iPhone), добавил UISwitch
к основному виду и подключил его к контроллеру представления как с помощью IBOutlet
, так и IBAction
(-valueChanged:
).
При запуске приложение вылетает с исключением, упомянутым в вопросе. Если я удалю переключатель из представления, он будет работать.
После тщательного осмотра я понял, что я управляю - перетаскивал соединения в ViewController.h
другого проекта в том же рабочем пространстве. "Автоматический" набор Редактор помощника интерфейса Builder (значок a.k.a Tuxedo chest) выбрал в качестве "аналога" неправильный файл (с правильным именем).
Надеюсь, это поможет кому-то, особенно потому, что оба шаблона проекта Single View Application и "SpriteKit Game" (в моем случае) создают класс контроллера представления по умолчанию под названием "ViewController".
Ответ 15
Если у вас разные файлы storybord, и если у вас есть ссылки на выход с созданием точек в ваших заголовочных файлах, вы просто удаляете соединения, щелкнув правой кнопкой мыши на владельце файлов.
Владелец файлов- > Щелкните правой кнопкой мыши- > удалите ненужное соединение.
Пройдите это для ясного объяснения.
Что это значит? "NSUnknownKeyException" , причина:... этот класс не является ключевым значением, совместимым с кодировкой для ключа X "
Ответ 16
Это обычно означает, что что-то пытается получить доступ к @property "givenName" .
Если вы делали что-то с Interface Builder(IB)
, обычной причиной является то, что вы либо:
- удалило это свойство из класса, но не удалило
подключений в IB еще
- ИЛИ: у вас есть объект File Owner, настроенный на неправильный класс (проверьте
свойства - разные зависимости, какая версия xcode, которую вы используете
- чтобы найти имя класса, его набор как. Вероятно, вы скопировали/вставили файл NIB и не изменили это поле в NIB), и вы подключились
выход для этого класса, но ваш фактический владелец файла - это что-то
отличается
Ответ 17
В моем случае у меня есть IBOutlet UILabel * description в .h, это было с желтым /!\- "не синтезируется", как я помню. Dunno, что это такое и почему только этот ярлык.
Но я получил эту ошибку и ошибку, как показано выше. Удалено * описание и воссоздание * description2. Никакого сбоя в результате.
Ответ 18
Для меня я переключил вызов для своего заголовка представления коллекции, где я регистрировал nib для регистрации класса. Это исправило это.
Ответ 19
For - это потому, что не имеет 2 функции
@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
Ответ 20
Мне пришлось удалить все объекты и снова добавить их. Это, похоже, устранило проблему.