Xcode 4: creazione di un xib UIView, connessione non corretta


84

Sto cercando di creare un pennino che contenga una vista che verrà incorporata in un TableViewCell. Ho creato l'interfaccia e i file di implementazione ResultCell.he ResultCell.m. Sono stock, out-of-the-box, senza modifiche al codice.

Quindi creo un file XIB vuoto e trascino su di esso una UIView. Quindi faccio clic su Proprietario del file e imposto il tipo su ResultCell. Faccio clic sulla vista e imposto anche la sua classe ResultCell.

Ecco i problemi che ho:

  1. Quando si utilizza la visualizzazione Assistant Editor (in cui vivo), il ResultCell.hfile non viene visualizzato durante la visualizzazione del file ResultCell.xib. Devo forzare il caricamento facendo clic su Automatico e selezionando il file.
  2. Quando rilascio un'etichetta nella vista, quindi Ctrl + clic e trascino su .h per creare una presa, viene visualizzato questo messaggio di errore: " Impossibile inserire una nuova connessione di presa: Impossibile trovare alcuna informazione sulla classe denominata ResultCell. "

Ho provato a creare e ricreare la vista, ma non funziona e ho iniziato a perdere la pazienza. Qualsiasi aiuto sarebbe molto, molto apprezzato!


Mi sono imbattuto in questo da solo. Ieri sera ha funzionato e oggi niente. Ti faccio sapere se trovo qualcosa.
Tavison

Per la cronaca, più risposte qui mi hanno aiutato nell'ultimo anno. Le versioni recenti di Xcode hanno migliorato le cose.
Tim Sullivan

Risposte:


82

Potrebbe non funzionare per il tuo problema specifico, ma a volte ricevo quell'errore quando lavoro con pennini appena creati. Eliminare e ricreare i pennini e i controller di visualizzazione con gli stessi nomi di prima non ha risolto il problema, ma il riavvio di Xcode sì.


+1 ha funzionato anche per me. Riavvia XCode e ora posso CTRL + trascina per creare nuove proprietà @ nel mio file .h.
Mike Gledhill

1
La risposta di David Pisoni ha funzionato per me. Il semplice riavvio di Xcode non ha tagliato la senape.
Andy

Non ho riscontrato questo problema per molte versioni di Xcode ora, quindi probabilmente c'è un'altra causa che è più diffusa ora rispetto a quella che stavo sperimentando quando ho scritto questa risposta l'anno scorso.
Deframmentato

@Defragged puoi anche includere il passaggio per svuotare la cache premendo Comando K prima di quotare o ancora meglio è uscire da Xcode quindi svuotare la cache ( ~/Library/Developer/Xcode/DerivedData)
user1046037

Sto lavorando con Xamarin Studio. Ho dovuto chiudere xcode e xamarin studio, quindi riaprire Xamamrin Studio e aprire un file xib da qui che è stato avviato in xcode. L'assistente editor si è quindi aperto correttamente.
Dave Haigh

113

Sono entrato in uno stato simile proprio oggi. Era molto strano: potevo collegare qualsiasi XIB (nuovo o esistente) a qualsiasi classe ViewController già esistente nel progetto, ma non potevo creare un nuovo ViewController e collegarlo correttamente a qualsiasi XIB. La funzionalità "assistente" non funzionava, né la funzionalità di connessione da IB a file di intestazione.

Chiudere il progetto e riaprirlo non lo ha risolto.
L'uscita da XCode e il riavvio non lo hanno risolto.
La creazione di un nuovo progetto e il test della funzionalità hanno funzionato bene, il che mi ha portato a credere che ci fosse qualcosa di danneggiato in qualche cache da qualche parte.

La mia soluzione

  • Chiudi il tuo progetto.
  • Vai alla cartella ~ / Library / Developer / XCode / DerivedData e RIMUOVI tutte le sottocartelle che fanno riferimento al progetto su cui stai lavorando.
  • Apri il tuo progetto in XCode. Il problema dovrebbe essere risolto ora.

Per inciso, la semplice esecuzione di una pulizia completa non sembrava chiarire le cose. Ho dovuto cestinare i dati derivati. Sono certo di essere entrato in questa posizione a causa dei giochi git a cui stavo giocando, ma non avevo idea di come uscirne, perché anche il passaggio alle versioni precedenti di git non aiutava. (Questo era anche un grande indizio del fatto che fosse qualcosa di non tracciato dal progetto stesso.)


6
Ho appena effettuato l'accesso a SO sul mio Mac, solo per poter votare questa risposta! Ha funzionato totalmente per me. Questo mi stava facendo impazzire, poiché sto appena imparando a usare XCode ed è già abbastanza difficile senza problemi ridicoli come questi. :) Grazie!!!
Dave

2
funziona anche senza riavviare xcode; solo l'eliminazione dei dati derivati ​​e la ricostruzione (su un progetto iOS)
nob

Questo ha funzionato quando il riavvio di xcode non ha funzionato. Non ho idea di come sia successo il metodo di David Pisoni ha funzionato alla grande.
mmopy

Eccezionale. Come lo sai? Ha funzionato per me.
Hol

1
lol è bello sapere che IOS e xcode possono essere altrettanto difettosi se non di più rispetto all'uso di eclipse e Android: p
James andresakis

14

Ho appena avuto questo problema e il riavvio di Xcode non lo ha risolto. Ho rimosso i file di classe dal progetto, quindi li ho aggiunti di nuovo e ha iniziato a funzionare.


13

Ho avuto lo stesso problema. E ho provato:

  • Riavvio di Xcode
  • Eliminazione dei dati derivati
  • E molti altri

Niente di tutto questo ha funzionato. Quello che ha funzionato per me è stato semplicemente:

  • Rimuovi i file di classe "sospetti" da Project (rimuovi solo i riferimenti, eh?)
  • Aggiungili di nuovo al progetto

E fatto!


2
Questo ha funzionato per me, grazie! È stata la prima cosa che ho provato, oltre a riavviare XCode, poiché sembrava la quantità minima di lavoro e rischio, e ha funzionato alla grande.
adriandz

1
ha funzionato per me dopo aver riavviato xcode e cancellato i dati derivati ​​non
elad s

1
Questo ha funzionato anche per me. Questo potrebbe avere qualcosa a che fare con il refactoring dei nomi delle classi (che è quello che ho appena fatto prima).
tassa ecologica

9

Se il riavvio di Xcode non funziona, ho scoperto che la commutazione del nuovo file .m fuori e di nuovo nell'appartenenza di destinazione funziona.


3

Questo mi ha aiutato:

  1. dal pannello dei file di progetto (lato sinistro) selezionare il file xib che è danneggiato.
  2. Fare clic sull'icona del proprietario dei file dalla visualizzazione dell'editor.
  3. dal pannello delle proprietà (lato destro) selezionare la terza scheda (in alto)
  4. specifica la "Classe personalizzata"

Se non vedi un "pannello", dai un'occhiata all'angolo in alto a destra della finestra e abilita i pulsanti di "visualizzazione" appropriati. Se non vedi i pulsanti "Visualizza", fai clic sul pulsante capsula più in alto a destra.


Di recente avevo cambiato (refactoring) il nome della classe. La classe personalizzata come menzionata in questa risposta era ancora impostata sul vecchio nome. L'ho cambiato con il nuovo nome ed è stato risolto.
PaulMrG

2

Ho notato che il file .m è stato spostato nella cartella en.lproj.

Basta eliminare (solo come riferimento) il file .m da Xcode e spostare .m fuori da en.lproj. Aggiungilo di nuovo per risolvere il problema.

Non preoccuparti, recupererai tutte le tue connessioni.


Il mio .m è stato generato automaticamente e non l'ho ancora modificato. L'ho fatto e tutto è andato bene. Nient'altro aveva funzionato.
entonio

2

Oggi ho riscontrato lo stesso problema. Il riavvio di XCode non ha risolto il problema per me. Sono stato in grado di riportare le cose alla normalità utilizzando l' opzione "Elimina" di "Dati derivati" del progetto che può essere trovato in Organizer . L'organizzatore afferma che "i dati derivati ​​includono indice, output di build e log". Immagino che l' indice o l' output di build stessero causando questo problema.


2

in XCode vai all'organizer, fai clic su progetto, fai clic su Elimina dati derivati ​​... quindi pulisci il progetto


2

Nel mio caso ha aiutato ad apportare una "falsa modifica" (solo uno spazio) al file di intestazione corrispondente.


Penso che questo possa averlo fatto anche per me. Nel mio caso ho aggiunto manualmente una presa. Sono stato quindi in grado di collegare i miei noodles ad esso, nonché di creare nuovi punti vendita trascinando ctrl.
Daniel Wood,

1
  1. ResultCell dovrebbe essere una sottoclasse di UITableViewCell
  2. Non dovresti trascinare a UIViewsulla tela vuota, dovresti trascinare aUITableViewCell
  3. È necessario selezionare la cella e cambiare è di essere il vostro sottoclasse
  4. Il proprietario è molto spesso un controller con una presa per la cella

Ogni volta che vuoi caricare una nuova cella, chiama:

 [[NSBundle mainBundle] loadNibNamed:nibName 
                               owner:controllerWithOutletToCell 
                             options:nil]

dopo il caricamento, utilizzare la cella e impostare ivar / outlet su zero, pronto per il carico successivo

ci sono altri modi, ma questo è comune


Se lo faccio, ho esattamente lo stesso problema. L'Assistente Editor non mostra il .h quando visualizzo il pennino e il tasto ctrl + trascina non crea il codice presa, visualizza l'errore.
Tim Sullivan

2
Stai usando Xcode 4.0.2? Puoi impostare manualmente l'assistente editor se si comporta in modo anomalo. Presumo che tu abbia riavviato l'app per ripetere il test (Xcode 4 spesso ne beneficia). Sembra che non riesca a trovare i file di classe nel progetto o che qualcosa sia denominato erroneamente: le maiuscole sono importanti. Il progetto è attualmente in costruzione? Questa è una funzionalità di livello molto alto che dipende dalla nuova tecnologia del compilatore.
bshirley

Aw, eff me. Sì, riavviando Xcode e ha iniziato immediatamente a funzionare. «Scusami, adesso cadrò sulla mia spada.
Tim Sullivan

1

Forse quello che ha funzionato per me è questo .. (Xcode v4.5)

Questo non ha funzionato

Stavo cercando di controllare il trascinamento nella definizione dell'interfaccia del mio .h

@interface SearchViewController : UIViewController

@end

Questo ha funzionato (forse è così che doveva funzionare, non lo sapevo prima) Vedi le parentesi aperte e chiuse. Controlla il trascinamento dopo la parentesi chiusa.

@interface SearchViewController : UIViewController
{
}

@end

1

Ho avuto un problema simile con un progetto scritto in Swift.

Quello che ha funzionato per me è stato impostare IBOutlet in un codice come questo

@IBOutlet var foo: UIView?

e successivamente collegalo a Interface Builder trascinandolo sul piccolo cerchio che è apparso proprio accanto alla riga del codice.


Questo è l'unico modo in cui sono riuscito a farlo funzionare anche per me. Stavo seguendo un tutorial Apple scritto per Objective-C (Inizia a sviluppare app iOS oggi) e avevo bisogno di connettere il campo di testo New To-Do Item. Finalmente ho creato @IBOutlet var textField: UITextField? e collegato a quello, e ha funzionato. Utilizzando XCode 6.4
andrewz

1

Nessuna delle soluzioni alternative di cui sopra ha risolto il problema del connettore per me, quindi ho accantonato il mio progetto domestico fino a quando non mi sono imbattuto nel seguente thread di stackoverflow:

https://stackoverflow.com/a/15873770/2846800

Stavo lavorando a un progetto di grandi dimensioni in una versione precedente di XCode e avevo disattivato l'indicizzazione. Riattivando l'indicizzazione, il mio problema è stato risolto:

defaults delete com.apple.dt.XCode IDEIndexDisable

Ora posso utilizzare le funzionalità di D&D di Interface Builder. Spero che questo possa aiutare gli altri ...


1

Questo problema sembra essere un bug di Xcode che si insinua principalmente quando si sostituisce un file con un nuovo file con lo stesso nome. Xcode sembra mantenere un riferimento al vecchio file con lo stesso nome.

Ad ogni modo, il modo per risolvere questo problema sembra essere:

  1. Pulisci il progetto
  2. Fare clic su (Il tuo progetto) nella vista Navigatore progetto. Vai a Compile Sources in Build Phases of the target for which you are building. Rimuovi e aggiungi di nuovo il file .m che ti dà problemi.
  3. In alternativa, nel File Inspector (vista Utilità) del file NIB, in Appartenenza target, deselezionare e ricontrollare il nome del target.
  4. Riavvia Xcode per una buona misura.
  5. Ovviamente, anche l'eliminazione e l'aggiunta di nuovo del file .m dovrebbe risolvere il problema.

(I passaggi 1 e 2 da soli lo hanno risolto per me.)


0

Se hai copiato file da un altro progetto, assicurati di selezionare la casella "Aggiungi a destinazioni"



0

Sintomo simile, ma causa diversa.

Apparentemente ho premuto backspace quando il focus era sulla vista assistente, perché una delle righe di commento del modello di file standard andava da // a /, il che si traduce nel file non compilato.

La correzione del commento ha consentito all'SDK di analizzare il file, riconoscerlo come UIViewController e aggiungerlo nell'output.

Quindi, se hai questo problema, esegui una build o analizza per vedere se ci sono errori che devono essere corretti nel file .h del controller di visualizzazione. POI prova le altre soluzioni.


0

Questo potrebbe essere un vecchio argomento, ma nel caso qualcuno dovesse avere lo stesso problema in futuro, prova a eliminare i file .xib, .h e .m associati e creane di nuovi. Per me, l'UIViewController nel mio file .h non era viola e nemmeno il backspace e la digitazione non hanno aiutato.


0

Basta mettere una linea tra @implementation e @synthesize. La maggior parte delle risposte qui hanno questo in comune. Ha funzionato per me

@implementation 

@synthesize

0

Ho appena provato tutto qui e niente ha funzionato (utilizzando un'anteprima per sviluppatori per Xcode 5).

L'unica cosa che ha funzionato per me è stata inserire questa riga incompleta nel mio file di interfaccia:

@property (nonatomic, weak)

Per qualsiasi motivo, l'aggiunta di punti vendita e azioni tramite trascinamento da un .xib ha funzionato correttamente.


0

Per me, la pulizia o l'eliminazione di DerivedData ha risolto il problema.

Ho provato a eliminare e ricreare la mia classe UIViewController più volte e ho riscontrato il problema ancora e ancora.

Quindi ho ricreato la classe UIViewController e le ho assegnato un nome diverso. Questo ha risolto il problema per me.


0

Ho avuto questo problema e ho trovato una soluzione non elencata sopra.

Nel mio caso, ho potuto vedere che c'era qualcosa di sbagliato nel file .h della classe perché il mio controller di visualizzazione personalizzato non riconosceva la classe: UIViewController (era in nero non viola). Tutti gli altri controller di visualizzazione personalizzati avevano: UIViewController in viola.

nel mio caso, e forse nel tuo, avevo bisogno di aggiungere la classe a obiettivi / fasi di compilazione / compilazione a discesa delle fonti. Il .m deve essere aggiunto. C'erano tutti gli altri .m ma non questo.

Una volta aggiunto, il: UIViewController è apparso in viola e tutto ha funzionato bene.


0

Per il mio caso, ho più progetti con alcune altre dipendenze. Ho provato a risolverlo eliminando i dati derivati ​​o riavviando XCode ma non ha funzionato. Alla fine, ho provato il seguente metodo e funziona:

Vai a target> Build Target Architectures Only> e imposta Debug e Release su NO.

Impostalo per tutti i progetti nell'area di lavoro e ricompila per assicurarti che non ci siano altri errori. Forse non aveva senso ma in qualche modo lo ha fatto. Durante la mia compilazione, ho avuto altri problemi come errori del linker e simboli non trovati.


0

Per il file * .m di questa vista di classe apri "Mostra ispettore file" e deseleziona "Appartenenza di destinazione" per questo progetto, quindi esegui Pulisci (menu Prodotto-> Pulisci) e controlla di nuovo "Appartenenza di destinazione" per questo progetto

inserisci qui la descrizione dell'immagine


0

Utilizzando Swift, ho avuto un problema simile. Ho scoperto che i commenti erano parte del problema per me.

Ho sfruttato il controller di visualizzazione predefinito, ci ho lavorato un po ', quindi ho creato un secondo controller di visualizzazione copiando l'intero primo, rimuovendolo solo a viewDidLoad () e rinominando la classe in TestViewController. Build ha funzionato, codice eseguito. Andava tutto bene.

Quando sono andato a trascinare un UITextField per creare una presa, non me lo permetteva. Ho notato che i miei commenti dicevano ancora "ViewController.swift", quindi ho cambiato il testo del commento in "TestViewController.swift" e l'ho ricostruito. Sono riuscito a collegare la mia presa!

Mi chiedo se quello che è successo è che l'indicizzatore stava leggendo i commenti così come i nomi delle classi, e in qualche modo si è confuso.


0

Spero che questo aiuti qualcuno là fuori.

Ho solo dovuto eliminare la cartella dei dati derivati. È necessario fare clic su Finestra -> Organizer -> Progetti -> Elimina dati derivati

E RIAVVIARE XCODE.

Dovresti essere a posto!


0

La nuova classe che non fa parte del "TARGET" è probabilmente la causa principale di questo, come accennato da alcune di queste risposte.

Quando si crea una nuova classe di cacao, per impostazione predefinita l'opzione per aggiungere una nuova classe all'obiettivo è selezionata per impostazione predefinita, ma se per qualsiasi motivo questa opzione non viene selezionata quando si preme Salva, si avrà questo problema.

Nuovo target di classe

Ognuna di queste soluzioni alternative che aggiungono la nuova classe alla destinazione delle app funzionerà per risolvere il problema ed è qualcosa che tutte queste 'correzioni' hanno in comune.

Penso che XCode abbia probabilmente alcuni bug che fanno sì che un nuovo file, per impostazione predefinita, NON venga aggiunto all'obiettivo principale dell'app. La soluzione si riduce a all'aggiunta della tua classe "non funzionante" al TARGET principale


0

In XCode 7.1, l'aggiunta del connettore in un punto diverso del file sorgente ha funzionato. L'errore che stavo facendo riferimento a una delle mie variabili come se fosse una classe (non aveva alcun senso). L'errore ha smesso di verificarsi quando ho aggiunto il connettore sotto quella variabile invece che sopra di essa.


0

C'è anche un motivo diverso per il problema ... se hai creato un nuovo file di classe cacao con un modello diverso da ios ... posso succedere ...

La soluzione sarebbe eliminarlo e ricrearlo con il modello giusto inserisci qui la descrizione dell'immagine

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.