Xcode - Come risolvere "NSUnknownKeyException", motivo: ... questa classe non è conforme alla codifica del valore chiave per la chiave X "errore?


1172

Sto cercando di collegare un UILabelcon un IBOutletcreato nella mia classe.

La mia applicazione si arresta in modo anomalo con il seguente errore.

Cosa significa questo?

Come posso ripararlo?

*** Chiusura dell'app a causa di un'eccezione non rilevata 'NSUnknownKeyException', motivo: '[<<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: questa classe non è conforme alla codifica del valore-chiave per la chiave XXX. "


11
pedrotorres ha ragione. Sì questo è giusto. Se stai eseguendo un UITableViewCell, in IB ricordati di impostare il proprietario del file su NSObject e UITableViewCell'Class alla classe .h che hai definito.
giuseppe

3
Quando si riscontra un problema del genere e la chiave offensiva è un'azione anziché un punto vendita, molto probabilmente si dispone di un punto vendita che fa riferimento erroneamente al nome della funzione dell'azione anziché al nome della variabile del punto vendita .
Alex Yursha,

2
Dovresti notare che il nome della chiave nel messaggio di errore (l'OP lo chiama 'XXXX') è il nome che hai dato a qualcosa nel tuo file pennino. Questo dovrebbe aiutare a restringere la ricerca.
Kris,

Ho presentato rdar: // 22105925 chiedendo ad Apple di rendere più evidenti questi errori in fase di compilazione. :)
jtbandes

come RISOLVERE IMMEDIATAMENTE il problema! stackoverflow.com/a/13812660/294884 fantastico punta
Fattie

Risposte:


980

Il tuo controller di visualizzazione potrebbe avere una classe errata nel tuo xib.

Ho scaricato il tuo progetto.

L'errore che stai ricevendo è

'NSUnknownKeyException', motivo: '[<<UIViewController 0x3927310> setValue: forUndefinedKey:]: questa classe non è conforme alla codifica del valore chiave per la stringa chiave. "

È causato dal Secondcontroller di visualizzazione in MainWindow.xibuna classe UIViewControlleranziché anzichéSecondView . Passare alla classe corretta risolve il problema.

A proposito, è una cattiva pratica avere nomi come "stringa" in Objective-C. Invita una collisione di denominazione di runtime. Evitali anche nelle app di prova. Nominare le collisioni può essere molto difficile da rintracciare e non si vuole perdere tempo.

Un'altra possibile ragione di questo errore: quando si copiano e incollano elementi da un controller a un altro, Xcode mantiene in qualche modo quel collegamento al controller originale, anche dopo aver modificato e ricollegato questo elemento nel nuovo controller.

Un altro possibile motivo per questo errore:

Cattivo outlet.

Hai rimosso o rinominato un nome di presa nel tuo .hfile.

Rimuovilo in .xibo .storyboardInspector connessione file.

Un'altra ragione possibile

(Nel mio caso) Estensione di UIView con proprietà associabili e valori di impostazione per quelle proprietà associabili (ad esempio ombra, raggio d'angolo, ecc.), Quindi rimuovi quelle proprietà dall'estensione UIView (per qualche motivo), ma quanto segue è <userDefinedRuntimeAttributes>rimasto in xml (of foo.storyboard):

<userDefinedRuntimeAttributes>
  <userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
      <color key="value" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
      <real key="value" value="50"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="point" keyPath="shadowOffset">
      <point key="value" x="5" y="5"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
      <real key="value" value="16"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="borderWidthValue">
      <real key="value" value="0.0"/>
  </userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>

Soluzione: fare clic con il tasto destro su foo.storyboard> Apri come codice sorgente> ricerca per keyPath (ovvero shadowRadius)> Elimina </userDefinedRuntimeAttributes>ciò che causa il problema


9
Inoltre, non dimenticare di collegare l'output "view" del pennino all'outlet view del proprietario del file (l'outlet view della tua classe personalizzata ereditato da UIViewController). Questo può essere fatto trascinando il controllo da "Proprietario del file" in "Posizionatori" per "visualizzare" in "Oggetti" e selezionando il punto di vista.
Nirma,

1
Mi sono assicurato che tutta la classe fosse già impostata, ma NSUnknownKeyException esce ancora :(
Zennichimaro

1
Non sto nemmeno usando Interface Builder e sto ancora ricevendo questo errore. Qualche idea di cosa stia succedendo?
sudo,

12
Non importa. Era per due cose: Xcode stava ancora accedendo al mio storyboard principale anche se era stato rimosso dal progetto e il simulatore lo aveva memorizzato nella cache. Consiglio vivamente di usare storyboard o NIB - sono ridicolmente problematici.
sudo,

5
@Josh Lol. Ogni volta che lavoro sulla motivazione per creare un'app nativa in xcode, finisce sempre con me passare una giornata a cercare di capire come fare qualsiasi cosa. Sono ac # dev quindi ho visto le offerte di Xamarin e Telerik (nativescript) ultimamente.
The Muffin Man

1524

Potresti avere una cattiva connessione nel tuo xib.

Ho avuto questo errore molte volte. Mentre la risposta di TechZen è assolutamente giusta in questo caso, un'altra causa comune è quando si modifica il nome di una proprietà IBOutlet nel proprio .h / .m che si è già connessi al proprietario del file nel pennino.

Dal tuo pennino:

  1. Seleziona l'oggetto in IB e vai a 'Ispezione connessioni'.
  2. In "Punti di riferimento" assicurati che il tuo oggetto non sia ancora collegato al vecchio nome della proprietà ... se lo è, fai clic sulla piccola "x" per eliminare il riferimento e creare di nuovo.

    inserisci qui la descrizione dell'immagine

Un'altra causa comune se si utilizza Storyboard, il tuo UIButton potrebbe avere più di un compito (la soluzione è quasi la stessa del pennino):

  1. Apri lo storyboard e fai clic con il pulsante destro del mouse sul pulsante UIB
  2. Vedrai che c'è più di una assegnazione / riferimento a questo pulsante. Rimuovi una delle finestre in grigio "Principale ..." con la piccola "x":

    esempio 2


1
Grazie! Nel mio caso avevo 2 punti vendita nella stessa vista, e liberarmi di quello vecchio e agganciare la vista a quello nuovo finiva l'eccezione.
Mark Patterson,

il mio è stato duplicato due volte. Ho iniziato a disconnettermi dopo averlo trascinato e rilasciato da una versione Pro (da una versione Lite) pensando che fosse sospeso su connessioni nell'altro progetto. Quando ho trovato il duplicato, e ci sono voluti 3 clic per effettuare la disconnessione, ho sinceramente desiderato di averlo fatto 3 giorni prima. Oh bene, tale è la vita di un dev.
Aremvee,

Ho avuto il problema che UIButton avesse più di un compito. Questo ha risolto il mio problema.
miticalcoder

Ho avuto anche questo problema. Non dimenticare di controllare le connessioni degli outlet in viste particolari anziché solo in superview. Nel mio caso, le superview non mostravano connessioni errate = /
Augusto Carmo,

Ho riscontrato un errore simile nel caso in cui ho collegato l'uscita di un pulsante a un file swift ViewController errato la cui pagina non sarebbe stata ancora creata utilizzando la GUI
brw59

114

Ho dovuto eliminare l'app dal simulatore / iPhone per eliminare questo errore.


1
+1 questo risolto per me. Stavo ripulendo un codice che utilizzava IB. Quando ho eliminato un pulsante dal codice l'errore continuava a comparire anche quando questo pulsante non era affatto referenziato nei file pennino (almeno quello che potevo vedere).
domenica

2
Trovo che questo sia necessario se stai eseguendo il debug di due applicazioni che hanno lo stesso nome.
Anton,

Sì, sembra che qualcosa dal XIB sia memorizzato nella cache del simulatore, il che è un problema se stai testando gli aggiornamenti poiché in realtà non vuoi eliminare la vecchia app.
Carlos P

Ho avuto questo problema durante l'eliminazione del mio file XIB. Ciò ha risolto il problema.
balboa,

4
Se l'eliminazione dell'app non funziona, prova a eliminare la cartella XCode DerivedData. che può memorizzare nella cache un file xib errato. Apri XCode -> Preferenze -> Posizioni -> Apri la cartella DerivedData e trascinala nel Cestino.
Philip Fung,

107

Ho riscontrato questo errore durante il tentativo di implementare una ViewCell personalizzata per una tabella. Quando ho evidenziato Visualizza controller per XIB e collegato agli elementi in CellView ha causato l'errore "questa classe non è conforme alla codifica del valore chiave per la chiave" una volta eliminati, è stato eliminato l'errore.

Elimina le connessioni nell'immagine qui sotto. Elimina le connessioni in Impostazioni quando viene evidenziato Proprietario file

Assicurati solo di avere solo le connessioni con la cella di visualizzazione tabella. Per controllare fai clic sulla cella di visualizzazione tabella e in INSPECTOR cerca le tue connessioni.

La connessione dovrebbe essere qui quando viene evidenziata la cella di visualizzazione tabella


4
Questo l'ha fatto per me, grazie mille. Ho eliminato le connessioni quando è stato selezionato "File's Owner" nella colonna di sinistra, quindi ho selezionato la mia cella personalizzata e le ho ricollegate. Successo!
Rogare,

Anche con xcode7 funziona, basta usare il pannello "Ispezioni connessioni" giusto. Rimuovere lo sbocco dalla tabella e dall'etichetta, quindi aggiungerlo nuovamente e tutto dovrebbe funzionare.
lifeisfoo il

3
Funziona ma devi assicurarti che FileOwner non sia stato impostato !! Il proprietario del file dovrebbe rimanere NSObject. stackoverflow.com/questions/13793162/...
devjme

La stessa risposta mi ha salvato due volte!
wm.p1us

99

A volte questo ha a che fare con il tuo "Eredita dal bersaglio" Quel valore deve essere impostato. Con le app a target singolo puoi semplicemente selezionare Eredita da target. Se hai più di un bersaglio seleziona il bersaglio desiderato.

inserisci qui la descrizione dell'immagine


Questa risposta mi ha aiutato per un caso specifico. Devo continuare a lavorare su un vecchio progetto obj-c con obiettivi multipli. Creo un UITableViewCell personalizzato in Swift e ho avuto lo stesso errore. Abilitando "Inherit From Target" ha funzionato. Grazie!
magohamoth,

Il modulo non è sempre impostato correttamente; ad es. se si inserisce il nome della classe prima di creare effettivamente la classe.
Johan,

Ho inserito il nome della classe senza premere il tasto "Invio" alla fine, quindi l'IDE non ha controllato automaticamente questo flag. Ho perso 1 ora su questo. Grazie.
MatPag,

Non ho mai riscontrato questo tipo di errore in obj-c. Ma grazie ha risolto il mistero.
Pradeep Kachhawaha,

perché è sepolto nella terza pagina?
Sergio,

65

Se si tratta di un'app solo per iPhone, non universale, assicurati che il campo seguente sia vuoto:

Target> Riepilogo> Informazioni sulla distribuzione di iPhone / iPod> Interfaccia principale

Se si specifica un xib lì si blocca.


2
Sì, è stato per me. Mentre mi muovo per aggiungere un nuovo controller della vista di avvio, ho impostato questo sulla nuova classe / pennino. Dopo aver collegato l'outlet di visualizzazione, ho riscontrato questo errore. La cancellazione di questo campo lo ha risolto.
terribile

Questo ha funzionato per me. Nota che ho dovuto anche eliminare la vecchia versione dal dispositivo / simulatore per farlo funzionare.
jimt

Grazie - questo era il mio problema. Avevo rinominato il mio file dello storyboard per iPad e non mi ero aggiornato nelle preferenze del mio progetto.
Robert Joseph,

2
Grazie! Questo mi ha risolto. (Ho dovuto eliminare l'app dal simulatore dopo aver modificato il campo Interfaccia principale per renderlo vuoto. La semplice modifica di quel campo non ha costretto il simulatore a interrompere la cache.)
snipe

Mi sono ricordato che ho cambiato le cose da un'app universale in un'app solo per iPhone e questo ha risolto l'errore!
Giustino,

59

Questo errore indica che un oggetto Interface Builder già connesso viene rimosso / rinominato nell'origine del proprietario (File's Owner).

Fai clic tenendo premuto il tasto Ctrl sul proprietario dei file in Interface Builder se vedi un punto esclamativo che è necessario correggere.

Nell'immagine sotto puoi vedere che "aRemovedView" ha un punto esclamativo alla sua destra, questo perché ho rimosso l'oggetto di visualizzazione IBOutlet mentre era già collegato all'IB.

inserisci qui la descrizione dell'immagine

Questo dà il seguente errore: Terminare l'app a causa di un'eccezione non rilevata 'NSUnknownKeyException', motivo: '[setValue: forUndefinedKey:]: questa classe non è conforme alla codifica del valore chiave per la chiave aRemovedView.'


Grazie! Questo mi ha risolto. Ho riscontrato questo problema da molto tempo e non sapevo come risolverlo se non ricominciare da capo. Questo è tutto, ha eliminato IBOutlet dal controller di visualizzazione, ma non sapeva che erano ancora referenziati / collegati nel proprietario (in questo caso "View Controller" nel generatore di interfacce - Xcode 6).
Ira Herman,

41

Ho avuto lo stesso problema e anche se la risposta di TechZen potrebbe essere davvero sorprendente, ho trovato difficile applicarmi alla mia situazione.

Alla fine ho risolto il problema collegando l'etichetta tramite il controller elencato in Oggetti (evidenziato nell'immagine seguente) anziché tramite il proprietario del file .

Spero che sia di aiuto.

inserisci qui la descrizione dell'immagine


37

nel mio caso si è verificato un errore nel codice sorgente dello storyboard, segui questi passaggi:

  1. per prima cosa apri la tua storyboard come codice sorgente
  2. Cercare <connections>
  3. rimuovere connessioni indesiderate

Per esempio:

<connections>
    <outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/>
    <outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/>
    <outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/>
</connections>

Come vedi, si tratta di connessioni tra i nomi delle variabili di codice e i tag xml del layout dello storyboard;)


33

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

La mia correzione era simile a Gerard Grundy. Nel creare un UITableViewCell personalizzato utilizzando un XIB, avevo erroneamente applicato il nome della classe personalizzata al proprietario del file anziché a UITableViewCell. L'applicazione della classe a UITableViewCell nell'area di disegno e il collegamento delle proprietà IBOutlet ad essa ha risolto il problema.


Ayyy, non crederci ... Non riesco a credere quanto spesso commetto questo errore. Grazie lol
Benjamin,

31
  1. Devi solo specificare IBOutletuna volta, l' IBOutletetichetta del tuo ivar non è necessaria.
  2. Stai istanziando il tuo NIB usando il tuo UIViewController? Ad un certo punto dovresti chiamare[SecondView initWithNibName:@"yourNibName" bundle:nil];

Questo ha aiutato! Stavo ottenendo un errore di conformità della codifica valore-chiave su una proprietà da un controller di visualizzazione diverso. Si scopre che stavo chiamando -initWithNibNamecon il nome del pennino sbagliato.
jlstrecker,

Sì, anche questo mi ha aiutato .. stavo usando UIViewController invece di MyCustomeViewController .. ma questo è un tipo di problema di gerarchia potrebbe essere .. l'introspezione non è riuscita a causa dell'oggetto classe posizionato male .. Grazie comunque
Futur

Ho avuto un problema simile. Due voci IBAction identiche per caso. Non mostrato nel codice, solo con il tasto destro del mouse su UIControl (A UIStepper nel mio caso). Basta cancellarne uno risolto.
Dave Hubbard,

30

Questo mi stava succedendo solo durante il debug su un dispositivo (iPhone). Il simulatore iOS funzionava bene. Fare un "Prodotto-> Clean" da Xcode sembrava risolvere il problema, ma non ho idea del perché.


Questo risolve il mio problema. tsk2x quasi 3 giorni di mal di testa.
user3818576

5
Fornisce una risposta alla domanda. Qualcosa si è incasinato nel pennino e risolto il problema. Ho letto e provato tutto quanto sopra senza risultati e poi ho fatto il clean, e dopo 1 ora di tentativi di ripararlo, la soluzione di Maj l'ha risolto. Mi sarebbe piaciuto vedere cosa nell'XML avrebbe potuto causare questo, ma sono passato.
LevinsonTechnologies

Questo risolve davvero il problema: ho provato numerosi suggerimenti sopra e il progetto ha risolto solo questo errore che improvvisamente ha iniziato a verificarsi. Ugg ...
DustinB,

Questo risolve il mio problema, ho provato molti dei suggerimenti di cui sopra. Sembra strano!
Naveen Shan,

23

Ho avuto esattamente lo stesso messaggio di errore e grazie (!!) a Kira da http://www.idev101.com sono stato in grado di risolvere la sfida. Ho trovato il suo sito solo dopo aver cercato su Google e impilato su tutti questi thread. Ora sto postando qui per il prossimo che arriva su StackOverFlow e ha la stessa sfida che ho avuto dal momento che quella persona molto probabilmente verrà su questa discussione su Google.

Mi sono reso conto che ho erroneamente fatto questo:

UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Invece di questo:

DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Dove

DeviceViewController

Era il nome della mia classe anche conosciuto come

DeviceViewController.h 
DeviceViewController.m

Dovrai

"import DeviceViewController.h"

nella tua implementazione (.m File) dove vuoi chiamare ad esempio un altro UIViewController.

Non mi dispiace assolutamente se sto solo affermando l'ovvio per i principianti come me e potrei abbassare i voti poiché questo non è esattamente correlato alla domanda ma stavo cercando 4 (?!?) Ore subito per la risposta a questo messaggio di errore . Se posso risparmiare questo a 1 o 2 persone sarebbe fantastico :)

PS: per chi è interessato a come il codice continua a caricare l'altro UIViewController:

    [self presentViewController:deviceViewController animated:YES completion:nil];

GRAZIE per tutti i passaggi lì, stavo usando Xcode 5 e non sapevo davvero come aggiungere manualmente un pennino in quanto puoi solo aggiungere lo storyboard per impostazione predefinita .... Ho ricevuto alcune istruzioni ma non dettagliate come la tua. Davvero aiutato !!
Pittfall,

"Ho sbagliato a farlo ..." grazie, non è la prima volta che passo molto a causa di questo errore davvero stupido
tontonCD

23

Può derivare dal fatto che il controllo sia stato trascinato e creato uno sbocco o un'azione e si sia dimenticato di eliminarlo. Anche se hai eliminato il codice, o anche se hai creato abbastanza cmd + Z, dovrai andare nella finestra di ispezione delle connessioni dello storyboard e vedere se l'azione o l'outlet che hai creato è ancora qui o no.


Grazie! Sono un n00b su Xcode e mi ci è voluto un po 'per trovare i collegamenti canaglia. In Xcode 9.2, puoi fare clic con il tasto destro del mouse sull'elemento nella vista storyboard e controllare "Punti di riferimento".
Kunigami il

21

Osservando le altre risposte sembra che ci siano molte cose che possono causare questo errore. Eccone uno in più.

Se tu

  • avere una vista personalizzata
  • aggiunta una proprietà @IBInspectable
  • e successivamente lo ha eliminato

Quindi potresti anche ricevere un errore simile a

Impossibile impostare la proprietà ispezionata dall'utente (xxx) su [Your Custom View] ...: questa classe non è conforme alla codifica del valore chiave per la chiave [xxx].

La soluzione è eliminare la vecchia proprietà.

inserisci qui la descrizione dell'immagine

Apri la finestra di ispezione Identità per la tua classe, seleziona il nome della proprietà in Attributi di runtime definiti dall'utente e premi il pulsante meno (-).


Sono venuto così spesso in questa pagina ... Questa volta ce l'ha fatta questa soluzione! Ma per quanto strano possa sembrare che la vecchia proprietà da eliminare fosse effettivamente su un altro ViewController rispetto a quello che si blocca, non ho idea del perché.
Cinn,

15

Questo succede a me quando il mio controller di visualizzazione originariamente aveva un file .xib, ma ora viene creato a livello di codice.

Anche se ho eliminato il file .xib da questo progetto. Gli utenti iPhone / iPad possono contenere file .xib per questo viewcontroller.

Tentare di caricare un file .xib di solito provoca questo arresto:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.'

La soluzione durante la creazione a livello di codice può essere questa:

-(void)loadView {
    // Ensure that we don't load an .xib file for this viewcontroller
    self.view = [UIView new];
}

12

La proprietà "Modulo" di View Controller in Identity Inspector potrebbe essere diversa da quella prevista. Assicurati inoltre che nuove classi vengano aggiunte all'elenco di destinazione.


votando da quando è stato così nel mio caso. Sto usando Swift e Storyboard. Quando ho creato un nuovo target di build (per creare una variante di build) l'app non funzionava nella nuova variante mentre la prima funzionava correttamente. L'app si è arrestata in modo anomalo su un controller di visualizzazione in cui il nome del modulo era in qualche modo impostato sul modulo dal primo target, mentre in View Controller funzionante era corrente - <nome modulo qui> . In questo caso è necessario cancellare il nome del modulo.
Mixaz,

11

Ho avuto un problema simile per un progetto che ha due obiettivi (con la propria MainWindow XIB). Il problema fondamentale che ha causato questo errore per me era che la classe UIViewController non era inclusa nell'elenco delle risorse del secondo progetto. Vale a dire builder di interfaccia mi ha permesso di specificarlo in MainWindow.xib, ma in fase di esecuzione il sistema non è riuscito a individuare la classe.

Vale a dire cmd-clic sulla classe UIViewController in questione e ricontrolla che sia inclusa nella scheda "Target".


9

Solo per aggiungere a questo, perché stavo ottenendo anche questo errore. Passare attraverso tutte queste risposte sembra valere soprattutto per lavorare con l'interfaccia utente e le cose dello storyboard. So che il poster originale sembrava funzionare con l'interfaccia utente, ma quando si cercano possibili motivi per questo errore, per lo più tutte le domande riconducono a questa domanda con quelle altre chiuse come duplicati o semplicemente avendo problemi a collegare le cose in uno storyboard, quindi lo farò aggiungi la mia soluzione.

Stavo lavorando alla codifica di un servizio Web in Swift 2. Avevo creato tutti gli oggetti proxy e gli stub necessari. Mentre scorrevo attraverso l'XML restituito, creavo un'istanza dinamica dei miei oggetti, che provenivano tutti NSObjecte setValue:forKeyli utilizzavo . Ogni volta che ha setValue:forKeytentato di impostare una proprietà, è saltato in aria con questo errore.

Ho avuto un'istruzione switch per ogni tipo con cui avevo a che fare (ad es Bool?. CShort?, String?) E per ogni nodo XML ho esaminato quale tipo era sull'oggetto, quindi ho convertito il valore in quel tipo e ho provato a impostarlo setValue:forKey.

Alla fine ho iniziato a commentare tutte queste setValue:forKeyrighe e ho scoperto che il mio defaultcaso dell'istruzione switch ha funzionato String?.

Ho finalmente capito che non è possibile utilizzare tipi rapidi opzionali con a setValue:forKeymeno che non abbiano una mappatura diretta su un tipo Objective-C come String?o NSNumber?. Ho finito per cambiare tutti i CShort?tipi in NSNumber?dato che ha una mappatura diretta. Per Bool?nel mio caso è andato tutto bene per me solo l'uso Boole inizializzare a false. Altri potrebbero non avere quel lusso.

Ad ogni modo, che mal di testa è stato così spero che questo aiuti qualcun altro che ha un problema simile e continua a essere reindirizzato a questa domanda e dicendo a se stesso: "Non sto facendo nulla nell'interfaccia utente !!".

Quindi, infine, per ripetere ancora una volta la codifica valore-chiave non funziona con gli optional. Di seguito ho finito per trovare un posto, ma ho dimenticato dove, quindi, a chiunque abbia pubblicato questo mi scuso e darei credito se mi ricordassi dove l'ho trovato, ma mi ha salvato la vita:

Non è possibile utilizzare KVC su una proprietà Int opzionale, poiché KVC è Cocoa / Objective-C e Objective-C non è in grado di visualizzare un Int opzionale - non è collegato a Objective-C. Objective-C può vedere solo i tipi collegati a Objective-C:

tipi di classe derivati ​​da NSObject

tipi di classe esposti con @objc

Strutture veloci che sono collegate a ponte


1
Se stai cercando di collegare un valore bool Swift tramite i collegamenti Cocoa, devi esporlo con la direttiva @objc; altrimenti si ottiene effettivamente questo errore. Questa dovrebbe essere la risposta migliore.
jvarela,

9

"questa classe non è conforme alla codifica del valore-chiave per la chiave" So che è un po 'tardi ma la mia risposta è diversa, quindi penso che debba essere postato, stavo spingendo il secondo controller in modo sbagliato, ecco un esempio

Modo sbagliato di spingere il controller

UIViewController* controller = [[UIViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Modo corretto

TempViewController* controller = [[TempViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Non ho trovato alcuna risposta come sopra, quindi potrebbe essere d'aiuto qualcuno con lo stesso problema


8

Questo potrebbe essere il caso di fare riferimento a un componente dell'interfaccia Xib che è stato rinominato o eliminato. La referenziazione funziona per me.


8

Ho appena avuto questo problema nel mio progetto duplicato e risolto controllando 2 posti:

1- Assicurati di avere il file .m nell'elenco -> Progetto - Fasi di compilazione - Compila fonti
2- Successivamente, vai al generatore di interfacce (probabilmente questo è un errore che si verifica solo con IB) e scollega tutte le proprietà, etichette, immagini , ecc ... Quindi ricollegare tutto. Mi sono reso conto di aver rimosso un attributo ma era ancora collegato in IB.

Spero che funzioni per alcuni.


7

Un altro problema "non conforme" che ho riscontrato è stato quando sono riuscito ad avere due copie di una classe per qualche motivo.

Stavo aggiungendo le chiavi alla copia sbagliata. Interface Builder vedeva ancora le chiavi e mi permetteva di collegarle, ma in fase di esecuzione utilizzava l'altra copia della classe che non aveva le nuove chiavi.

Per scoprire quale fosse la copia "giusta" ho usato il cmd-click di XCode sul nome della classe altrove per passare alla copia corretta, quindi ho eliminato le copie non utilizzate non valide (dopo aver apportato prima le mie modifiche dalla copia non utilizzata).

Morale della storia: i file di classe duplicati sono cattivi.


7

Questo errore è qualcos'altro!

Ecco come l'ho risolto. Sto usando xcode versione 6.1.1 e sto usando swift. Ho ricevuto questo errore ogni volta che la mia app ha tentato di eseguire un seguito per passare alla schermata successiva. Ecco cosa ho fatto.

  1. Controllato che il pulsante fosse collegato all'azione giusta (questo non era il problema, ma comunque buono da controllare)
  2. Verifica che il pulsante non abbia ulteriori azioni o punti vendita che potresti aver creato per errore. (Questo non era il problema, ma comunque buono da controllare)
  3. Controlla i log e assicurati che tutti i pulsanti nel PROSSIMO SCHERMO abbiano le azioni corrette e, se ci sono follower, assicurati che abbiano un identificatore univoco. (Questo era il problema)
    • Uno dei seguaci non aveva un identificatore univoco
    • Uno dei pulsanti aveva un'azione e due punti vendita che ho creato per errore.
    • Elimina eventuali punti vendita aggiuntivi e assicurati che i follower alla schermata successiva abbiano identificatori univoci.

Saluti,


6

Ho avuto lo stesso sintomo. La causa principale è stata che la "Targeting Target" per il mio file sorgente non era impostata sulla destinazione corretta. Presumo che ciò significhi che la mia classe non verrà creata e inclusa nella mia app.

Per correggerlo:

  1. Evidenzia il tuo file .m.
  2. Nel riquadro destro, selezionare File Inspector.
  3. Nella sezione "Abbonamento target", assicurati che sia selezionato l'obiettivo di build appropriato.

Spero che questo aiuti qualcuno là fuori.


6

Se si dispone di una sottoclasse UIViewController personalizzata con IBOutlet che causano problemi, l'unica serie di passaggi che ho riscontrato per eliminare effettivamente l'errore erano

.1 Cambia la classe in UIViewController

.2 Scollegare tutte le prese (ora avranno tutte il triangolo giallo di avvertimento) - potrebbe essere sufficiente solo per scollegare le prese problematiche.

.3 Esegui tutti i passaggi standard - ↑ ⌘K, elimina i dati derivati ​​(, tappetini di preghiera, perle di preoccupazione)

.4 Avvia l'app: vai alla scena problematica.

.5 Uccidi l'app, torna a Interface Builder cambia la classe con il nome della tua classe personalizzata.

.6 Ricollegare i punti vendita.

Avvia l'app e questo avrà normalmente risolto i problemi di conformità dei valori-chiave.


Funzionava quando si copiava e si incollava una scena nell'editor di Storyboard.
Mizmor,

5

Nel mio caso. Dopo l'unione non avevo punti mancanti nei file xib.

Maiusc + Comando + K

risolto il mio problema Ho pulito il mio progetto e ricostruito.


4

Nel mio caso, ciò è stato causato facendo riferimento al pennino sbagliato:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];

1
Mi succede quando rinomino la classe del controller di visualizzazione e dimentico che anche il nome del pennino deve cambiare. Poiché il nome del pennino è solo una stringa, non c'è nessun errore del compilatore.
Kris,

3

Stavo ottenendo questo errore con gli storyboard. La soluzione di cui sopra non sembra essere il problema, quindi ho finito per eliminare il controller di visualizzazione e aggiungerlo di nuovo (e, naturalmente, ricollegare la sequenza e riassegnare la classe) che lo ha risolto. Non so cosa fosse veramente, ma avevo rinominato la classe di controller di vista associata poco prima che iniziasse, quindi forse quello aveva nascosto qualcosa.


Ho di nuovo questo errore. Questa volta ho creato un nuovo controller di visualizzazione tabella vuota con la mia classe assegnata ad esso, lasciando solo quello non funzionante e spostato il seguito su di esso. Questo ha funzionato. Ho quindi copiato lentamente tutti gli elementi della vista fino a quando non si è verificato nuovamente un errore. Questa volta il problema si è rivelato che avevo assegnato alcuni "Attributi di runtime definiti dall'utente" per un selettore (pensavo che avrei potuto usarli per inizializzare il selettore in modo che non avrei dovuto farlo nel codice, nessuna idea se fosse possibile ). Rimozione che ha risolto il problema. Questo errore è davvero orribile, spero sia stato migliorato in una versione futura!
Simmetrico

3

Ho avuto lo stesso problema. Ho fatto il ripristino del simulatore. Rimozione e aggiunta del controllo pulsante. e finalmente fatto un pulito. :) Grazie allo stack overflow. Alcuni come il mio codice è diventato ok e ha iniziato a funzionare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.