setValue:forUndefinedKey:这个类不符合键值编码规范,无法为该键设置值。

78
我正在创建一个登录界面以查看支持票。第一个视图是票务视图,如果您未登录,则会将您推到登录屏幕。然而,我收到了以下错误信息:

Support[3209:18e03] * Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key LoginScreen.' *

First throw call stack: (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: terminate called throwing an 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>

3
请确保在你的 XIB 中设置了 LoginScreen 出口。 - CodaFi
这个错误发生在哪里?看起来可能是在票务视图控制器中。如果是这样,你应该发布那段代码而不是这段。 - rdelmar
1
这样的无法解释的异常通常是由于不干净的xib文件引起的。在Xcode中打开xib,单击ViewOwner并查看标有“!”的输出。 - AlexWien
如果它对我起作用了,我本来会这么做的。但它没有,所以我不会这样做。 - user1890328
在我的情况下,我没有缺失的插座。Shift + Command + K 解决了我的问题。我清理了我的项目并重新构建了它。 - Kiryl Bielašeŭski
我曾经遇到过同样的问题,但是我用了不同的方法解决了它。我的项目有不同的构建配置(指向不同的环境),这会创建具有不同捆绑标识符的构建。不知何故,我的一个单元格模块(在界面生成器中)被设置为特定的捆绑标识符。我只需将其设置为当前模块即可使其正常工作。设置为“无”并没有起作用。 - deepax11
20个回答

280

这种无法解释的异常常常是 xib 文件不干净造成的。在 Xcode 中打开 xib,选择 "File's Owner" 并点击 "Connection Inspector"(右上角箭头),以一次查看所有 outlet。 寻找 !,这表示缺少 outlet。


12
AlexWien,我爱你。对于其他可能困惑的人,如果您进入“故事板”>“查看_崩溃的页面”,然后单击连接检查器(屏幕右上角的小右箭头),就可以看到所有连接。我的问题是我删除了对象/更改了它们的名称,但连接仍然存在,并且使用旧名称。 - Mirror318
4
如果您正在使用自定义类支持您的视图,请确保您不要将其与“文件所有者”链接,而是与您视图的根目录链接,例如您的自定义UICollectionViewCell - Dennis
太棒了!捕获成功。谢谢您分享这个信息。 - swiftBoy
@Dennis,我已经忘记了单元格的事情。最近一直在做android开发,这个完全忘了。 :-P 还有一个注意点...如果你错误地使用了“文件所有者”,并进行了更正,但仍然出现错误,请检查XML。IB有时不会显示连接,如果以前有连接并将其移除,则可能仍然存在于XML中。我刚刚遇到过这种情况,浪费了我一个小时左右的时间。使用xcode 7.2.1。 - stuckj
这正是我遇到的问题,修复 ! 出口解决了问题。我真的很想知道你 @AlexWien 是如何发现这些事情之间的关系的! - Sebastian Sastre
显示剩余5条评论

38

请检查Interface Builder中的连接情况。

您可能正在引用一个不存在的IBOutletIBAction


34

看!

谢谢大家。通过你们的帮助,我解决了这个问题。所以,我希望这个截图对有同样问题的人有帮助。


27

前往Xcode的断点选项卡。使用底部的按钮添加异常断点。现在你将看到哪些代码正在调用setValue:forKey:和相关的堆栈。幸运的是,这将直接指向问题的来源。

奇怪的是您的类名为LoginScreen,但错误消息说有人在使用“LoginScreen”作为键。检查LoginScreen.m是否属于您的目标。

输入图像描述


脚注:使用Swift时会出现一个常见问题,如果您更改类的名称(因此,在代码中随处重命名它),Storyboard将遇到问题,您通常需要重新拖动涉及该类的任何连接,特别是在右侧的IdentityInspector选项卡中重新输入类的名称。(在图片示例中,我故意拼错了类名。 但是当您重命名类时,同样的事情经常发生;即使在IdentityInspector中看起来正确,您也需要再次输入名称;它会自动完成并且一切都会正常运行。)


我之前输入了一个新的类名,但它没有起作用,所以我拉下选择器并通过鼠标单击选择了那个类(当然是相同的)。现在它可以工作了。 - djdance
1
哇塞!!非常感谢!!我已经为这个问题苦苦挣扎了好几天,而你的脚注帮了我大忙。我重命名了类,并在身份检查器中一切看起来都没问题,但正如你所说,我必须重新输入类的名称才能使事情正常运行。浪费了太多时间进行调试和查找此问题。 - adubey
谢谢,这让我感到非常困扰。你提供的异常断点建议和重新输入表格单元格名称的建议都帮助我找到并修复了问题。在iOS中,Storyboards可能会非常棘手。 - James Dobson
一个异常断点指示我的VC类“不存在”。什么?原来VC的实现文件的“目标成员”(在Xcode窗口>实用程序窗格>文件检查器中)没有被选中。勾选以将文件添加到当前目标,一切正常。 - Code Roadie

25

我曾经遇到过创建自定义TableCell的类似问题。问题在于我将FileOwner设置为了我的自定义类并连接了输出口。

FileOwner应该保持为NSObject。


7

我曾经遇到过这个问题,检查了所有内容,但最终想起来尝试清理和清除派生数据,问题就得到了解决!


我遇到了同样的错误,这个方法解决了它(感谢 Chad),因此我认为这是一个非常有效的潜在解决方案。 - woody121
清理派生数据已解决问题。 - Husam

2

我遇到了类似的问题,但是我明确地使用了 initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 方法,并将类名作为传递的字符串(是的,这是不好的形式!)。

最终我删除并重新创建视图控制器,使用了稍微不同的名称,但是忘记更改方法中指定的字符串,因此我的旧版本仍然被使用 - 即使它已经在垃圾桶里了!

我以后可能会使用建议中提供的结构,详情请参见:Is passing two nil paramters to initWithNibName:bundle: method bad practice (i.e. unsafe or slower)?

- (id)init
{
    [super initWithNibName:@"MyNib" bundle:nil];
    ... typical initialization ...
    return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    return [self init];
}

希望这能帮助到某些人!

你也可以使用NSStringFromClass([self class])代替@"MyNib",以避免每次使用此结构时重新输入类名。 - RndmTsk

2

这个错误是另外一种错误!

下面是我如何解决的。我使用的是xcode版本6.1.1,使用的是swift语言。每当我的应用程序尝试执行segue跳转到下一个屏幕时,就会出现此错误。以下是我所做的。

  1. 检查按钮是否连接到正确的操作。(虽然这不是问题,但还是要检查一下)
  2. 检查按钮是否有任何其他您可能错误创建的动作或输出口。(虽然这不是问题,但还是要检查一下)
  3. 检查日志,确保下一个屏幕中的所有按钮都具有正确的操作,并且如果存在任何segue,请确保它们具有唯一标识符。(这就是问题所在)
    • 其中一个segue没有唯一标识符
    • 其中一个按钮有一个动作和两个我错误创建的输出口。

删除任何额外的输出口,并确保您转到下一个屏幕的segue具有唯一的标识符。

干杯,


1
这是第三个问题。下一个视图控制器中有一个数字问题。在异常处添加断点有助于解决问题。 - agarcian

1

这是因为它没有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

1

这通常意味着某个东西正在尝试访问@property "givenName"

如果您正在使用Interface Builder(IB),则通常的原因是您要么:

  1. 从类中删除了该属性,但尚未删除IB中的挂钩
  2. 或者:您将文件所有者对象设置为错误的类(检查属性 - 根据您使用的xcode版本不同而不同
    • 找到设置的类名。您可能复制/粘贴了一个NIB文件,并且没有在NIB中更改此字段),并且已经连接了该类的出口口,但实际的文件所有者是其他内容

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接