objective c - setValue: forUndefinedKey: Diese Klasse ist nicht key-coding-kompatibel für den Schlüssel




objective-c xcode (14)

Ich erstelle ein Login, um Support-Tickets anzuzeigen. Die erste Ansicht ist die Ticketansicht. Wenn Sie nicht eingeloggt sind, gelangen Sie zum Anmeldebildschirm. Ich erhalte dies jedoch:

Support [3209: 18e03] * Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSUnknownKeyException', Grund: '[setValue: forUndefinedKey:]: Diese Klasse ist für den LoginScreen nicht key-coding-kompatibel.' *

Ersten Wurf 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 heißt eine Ausnahme werfen

Hier ist mein Code für 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

und 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>

Überprüfen Sie Ihre Verbindungen in Interface Builder. Sie beziehen sich wahrscheinlich auf ein nicht vorhandenes IBOutlet oder IBAction .


Denn ist das nicht 2 Funktion haben

@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

Dies ist mir in folgendem Szenario passiert:

Ich habe ein zweites Projekt in meinem Arbeitsbereich erstellt und "Single View Application" für die Vorlage ausgewählt.

Ich ging dann zum Interface Builder (Haupt-Storyboard), fügte der Hauptansicht einen UISwitch hinzu und verband ihn über ein IBOutlet und eine IBAction mit dem View-Controller ( -valueChanged: .

Beim Start stürzt die App mit der in der Frage erwähnten Ausnahme ab. Wenn ich den Schalter aus der Ansicht entferne, funktioniert es.

Nach sorgfältiger Prüfung wurde mir klar, dass ich die Verbindungen in den ViewController.h eines anderen Projekts im selben Arbeitsbereich gezogen habe. Der 'Assistent' des Interface Builders (auch bekannt als Tuxedo-Truhen-Symbol ) wählte als "Gegenstück" die falsche Datei (mit dem richtigen Namen).

Ich hoffe, das hilft jemandem, besonders, weil sowohl die 'Single View Application' als auch die 'SpriteKit Game' Projektvorlagen (in meinem Fall) eine Standard-View-Controller-Klasse namens "ViewController" erstellen.


Dieser Fehler ist etwas anderes!

Hier ist, wie ich es behoben habe. Ich benutze xcode Version 6.1.1 und benutze swift. Ich habe diesen Fehler jedes Mal erhalten, wenn meine App versucht hat, einen Übergang zum nächsten Bildschirm auszuführen. Hier, was ich getan habe.

  1. Überprüft, dass die Schaltfläche mit der richtigen Aktion verbunden war. (Dies war nicht das Problem, aber immer noch gut zu überprüfen)
  2. Stellen Sie sicher, dass auf der Schaltfläche keine zusätzlichen Aktionen oder Ausgänge vorhanden sind, die Sie versehentlich erstellt haben. (Das war nicht das Problem, aber immer noch gut zu überprüfen)
  3. Überprüfen Sie die Protokolle und stellen Sie sicher, dass alle Schaltflächen in der NEXT SCREEN die richtigen Aktionen haben, und wenn es irgendwelche Übergänge gibt, stellen Sie sicher, dass sie eine eindeutige Kennung haben. (Das war das Problem)
    • Eines der Segmente hatte keine eindeutige Kennung
    • Einer der Knöpfe hatte eine Aktion und zwei Ausgänge, die ich versehentlich erstellt habe.

Löschen Sie alle zusätzlichen Anschlüsse und stellen Sie sicher, dass die Übergänge zum nächsten Bildschirm eindeutige Kennungen haben.

Prost,


Gehen Sie zu Xcode's Haltepunkte Tab. Verwenden Sie die Schaltfläche am unteren Rand, um einen Ausnahmehaltepunkt hinzuzufügen. Jetzt sehen Sie, welcher Code setValue aufruft: forKey: und der zugehörige Stack. Mit etwas Glück wird man direkt auf die Ursache des Problems hinweisen.

Seltsam, dass Ihre Klasse LoginScreen ist, aber der Fehler sagt, dass jemand "LoginScreen" als Schlüssel verwendet. Überprüfen Sie, ob LoginScreen.m Teil Ihres Ziels ist.

Fußnote: Mit Swift tritt ein häufiges Problem auf, wenn Sie den Namen einer Klasse ändern (Sie benennen ihn also überall in Ihrem Code um). Storyboard hat damit zu kämpfen, und normalerweise müssen Sie alle Verbindungen, die diese Klasse betreffen, neu ziehen . Geben Sie insbesondere den Namen der Klasse erneut ein, der auf der Registerkarte IdentityInspector auf der rechten Seite verwendet wird. (Im Beispiel habe ich absichtlich den Klassennamen falsch geschrieben. Aber das gleiche passiert oft, wenn man eine Klasse umbenennt; auch wenn es in IdentityInspector scheinbar korrekt ist , müssen Sie den Namen erneut eingeben; er wird automatisch vervollständigt und Sie können es gut gehen.)


Ich bin heute auf dasselbe Problem gestoßen. Wie in dieser Antwort vorgeschlagen , war das Problem eine unreine Xib. In meinem Fall war die unreine Xib das Ergebnis der Aktualisierung einer Xib, die von etwas anderem als dem View-Controller, dem sie zugeordnet war, geladen wurde.

Mit Xcode konnte ich eine neue Steckdose erstellen und bevölkern und sie mit dem Besitzer der Datei verbinden, obwohl ich sie explizit mit der Quelle des richtigen View-Controllers verbunden habe. Hier ist der von Xcode generierte Code:

    <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>

Wenn ich meine App ausgeführt habe, stürzte sie mit dem gleichen not key value coding-compliant Fehler ab, der not key value coding-compliant . Um das Problem zu beheben, entfernte ich die Steckdose aus dem Besitzer der Datei in Interface Builder und verband es explizit mit dem View-Controller-Objekt auf der linken Gliederung statt mit dem Code im Assistenten-Editor.


Ich hatte ähnliches Problem beim Erstellen von benutzerdefinierten TableCell. Das Problem war, dass ich FileOwner auf meine benutzerdefinierte Klasse gesetzt und dann die Anschlüsse verbunden habe.

FileOwner sollte NSObject bleiben.


Ich hatte dies und schaute über alles nach und sah keine Probleme, aber schließlich erinnerte ich mich an Clean und Clear Abgeleitete Daten und das löste es!


Ich hatte ein ähnliches Problem, aber ich verwendete initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil explizit mit dem Namen der Klasse als String übergeben (ja schlechte Form!).

Ich habe den View-Controller gelöscht und neu erstellt, indem ich einen etwas anderen Namen verwendet habe, aber ich habe es versäumt, die in der Methode angegebene Zeichenkette zu ändern, daher wurde meine alte Version immer noch verwendet - obwohl sie im Papierkorb war!

Ich werde diese Struktur wahrscheinlich wie folgt verwenden: Übergibt zwei Null-Parameter an initWithNibName: bundle: method bad practice (dh unsicher oder langsamer)?

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

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

Hoffentlich hilft das jemandem!


Ich musste alle Objekte löschen und neu hinzufügen. Dies schien das Problem behoben zu haben.


In meinem Fall habe ich IBOutlet UILabel * Beschreibung in .h, es war mit gelb /! \ - "wird nicht synthetisiert" , wie ich mich erinnere. Weiß nicht, was ist das und warum nur dieses Label.

Aber ich habe diesen Absturz und Fehler wie oben. Gelöschte * Beschreibung und neu erstellen * description2. Kein Absturz im Ergebnis.


Solche unerklärlichen Ausnahmen sind oft das Ergebnis einer unreinen xib Datei. Öffne die xib in xcode, wähle den Besitzer der Datei und klicke auf den "Connection Inspector" (Pfeil oben rechts), um alle Ausgänge gleichzeitig zu sehen. Suche nach ! s, die auf einen fehlenden Ausgang hinweist.


Wenn Sie verschiedene Storybord-Dateien haben und wenn Sie Outlet-Referenzen mit Out-Out-Creation in Ihren Header-Dateien haben, dann entfernen Sie einfach die Verbindungen, indem Sie mit der rechten Maustaste auf den Besitzer der Datei klicken.

Besitzer der Dateien -> Rechtsklick -> entfernen Sie die unerwünschte Verbindung dort.

Gehen Sie das durch, um eine klare Erklärung zu erhalten. Was bedeutet das? "'NSUnknownKeyException', Grund: ... diese Klasse ist für den Schlüssel X nicht Schlüsselcodierung-kompatibel"


Danke Leute. Ich habe dieses Problem durch Ihre Hilfe gelöst. Also, ich hoffe, dieser Screenshot ist hilfreich für Personen, die dasselbe Problem haben.





cocoa