Problema di importazione di Swift Bridging Header


123

Seguendo le istruzioni, ho creato un'intestazione di bridging e l'ho aggiunta al mio progetto. Purtroppo, si è verificato il seguente errore:

: 0: errore: impossibile importare l'intestazione Objective-C '--- percorso - a --- header / .... h'

Screenshot 1

Nelle impostazioni di compilazione ho aggiunto la stringa del percorso di ricerca dell'intestazione alla posizione dell'intestazione di collegamento, ma nulla ha aiutato.

Qualcuno ha riscontrato questo problema?


Potresti invece aggiungere tu stesso il file di intestazione. Usa il Nuovo file .. per aggiungere un nuovo file Objective-c .m vuoto. Questo farà sì che xcode ti offra un file header-bridge in cui puoi aggiungere le tue importazioni. È quindi possibile eliminare il file .m appena aggiunto
markhunte

Sì, ho provato anche in questo modo certamente, ma niente ha aiutato
Nikita Pronchik

È su un nuovo progetto o lo stesso che hai fatto a mano?
markhunte

È su un nuovo progetto, ho aggiunto il wrapper di supporto portachiavi, che ho scritto una volta su OBJC
Nikita Pronchik

Scusate. Non sono sicuro di cosa intendi per wrapper di supporto portachiavi aggiunto. Ma ho notato che sei su iOS, ottieni la stessa cosa con un progetto OSX che è quello che ho usato
io

Risposte:


153

Fai attenzione ad aggiungere il file alla cartella in cui si lamenta il tuo errore! Ho fatto lo stesso errore, se crei il file da Xcode, andrà nella cartella: Project-> Project-> Header.h

E Xcode sta cercando Project-> Header.h

Ciò significa che devi mettere il file nella cartella del progetto (ProjectName-> ProjectNameFolder)!

Spero che aiuti ;)

AGGIORNATO: Non sono sicuro di aver capito cosa intendi, ma prova questo per risolvere il tuo problema:
1. Elimina tutti i tuoi file di bridging che hai creato fino ad ora.
2. Seleziona la cartella principale del progetto e premi Nuovo file-> iOS-> File di intestazione.
3. Scrivi le tue importazioni nel file di intestazione creato.
4. Seleziona il progetto all'interno di Xcode-> Build Settings, digita nel campo di ricerca: bridging e inserisci nella chiave SWIFT_OBJC_BRIDGING_HEADER il nome del tuo file header o il percorso ad esso!

Se segui questi passaggi, il tuo file di intestazione verrà creato nella posizione corretta!

: D Spero che aiuti!


Bene, ho appena provato questo metodo, l'intestazione è davvero visibile, ma, sfortunatamente, le classi Obj-C a ponte sono ancora invisibili (dopo averle incluse nell'intestazione a ponte)
Nikita Pronchik

11
All'inizio la risposta dice "È necessario mettere il file allo stesso livello di xcodeproj", alla fine dice "assicurati che il file sia ... non allo stesso livello di xcodeproj". Perché?
Boon

3
Volevo dire che il file deve essere posizionato all'interno della sottocartella del progetto, non allo stesso livello di xcodeproj. Esempio: nella cartella del tuo progetto hai project, project.xcodeproj e projecttests. Il file deve essere nella cartella del progetto :)
Renan Kosicki

5
Ho provato di tutto, ma niente funziona per me. Questo è molto irritante. Sto lavorando con xcode 8 e swift 3. Potete aiutarmi
Hardik Shah

1
Sono confuso se dici "Ciò significa che devi mettere il file allo stesso livello di xcodeproj!" ma dopo aver detto "Assicurati che il file si trovi all'interno della cartella principale del progetto non nello stesso livello di xcodeproj!" qual é?
bakalolo

68

Nel mio caso questo è stato effettivamente un errore a seguito di un riferimento circolare. Avevo una classe importata nell'intestazione di bridging e il file di intestazione di quella classe stava importando l'intestazione rapida ( <MODULE_NAME>-Swift.h). Lo stavo facendo perché nel file di intestazione Obj-C avevo bisogno di usare una classe dichiarata in Swift, la soluzione era semplicemente usare il @classdichiarativo.

Quindi, in pratica, l'errore diceva "Impossibile importare l'intestazione del ponte", l'errore sopra diceva che il <MODULE_NAME>-Swift.hfile non era stato trovato, sopra c'era un errore che puntava a uno specifico file di intestazione Obj-C (vale a dire un controller di visualizzazione).

Ispezionando questo file ho notato che aveva il -Swift.h dichiarato all'interno dell'intestazione. Spostare questa importazione nell'implementazione ha risolto il problema. Quindi avevo bisogno di usare un oggetto, chiamiamolo MyObjectdefinito in Swift, quindi ho semplicemente cambiato l'intestazione per dire

@class MyObject;

1
È sciocco, ma spostarlo nel file di implementazione ha funzionato anche per me. Sfortunatamente ne avevo bisogno nell'intestazione perché la mia classe implementa un delegato definito in un file swift. Ma poiché obj-c non si preoccupa se la mia classe implementa effettivamente il delegato quando lo passo, mi accontento di questo. Ma idealmente ci sarebbe un altro modo
Oren

Potrebbe anche essere necessario controllare le importazioni di quello che stai portando nell'intestazione del bridging. Se una qualsiasi di queste classi importate ha un riferimento al file "-Swift.h" dovrai spostare la dichiarazione nel file .m.
Kyle Carruthers

30

Trova il percorso in:

Impostazioni build / Swift Compiler - Generazione codice / Intestazione bridge Objective-C

ed elimina quel file. Allora dovresti stare bene.


2
Hai vinto. Ho perso così tanto tempo su questo. Semplice ed efficace. Xcode sta facendo qualcosa di strano con questo percorso, come aggiungerlo a $ (SRCROOT) dietro le quinte. Penso che avere uno spazio nel mio percorso potrebbe essere parte del problema, ma questo era il proiettile d'argento.
giovedì

1
come si cancella quel file?
Jacky Wang

7
In Xcode 8 - invece di "Generazione codice" è in Swift Compiler - Generale.
Vivek Bansal

Grazie mi salvi ... Grazie mille
Vijay Rathod

18

Questo probabilmente interesserà solo una piccola percentuale di persone, ma nel mio caso il mio progetto utilizzava CocoaPods e uno di quei pod aveva una specifica secondaria con i suoi CocoaPods. La soluzione era utilizzare le importazioni ad angolo completo per fare riferimento a qualsiasi file nei pod secondari.

#import <HexColors/HexColor.h>

Piuttosto che

#import "HexColor.h"

2
Qual è la differenza?
Daniel Gomez Rico

Questo è stato il problema per me. Ho ricevuto il messaggio di errore "Impossibile importare l'intestazione Bridging" e "Impossibile trovare XYZ.h". Apportare questa modifica lo ha risolto per me su Xcode 6.4 e Swift 1.2.
Entalpi

1
@danielgomezrico Un'istruzione punta al file in una sottodirectory. L'altro punta a un file che non esiste.
Casey Murray

La soluzione per questo errore per me quando utilizzavo CocoaPods era semplicemente eseguire nuovamente l'installazione del pod dopo aver creato la nuova configurazione.
macchina da scrivere

16

Per me l'eliminazione dei dati derivati ​​ha risolto il problema, ho notato che anche se ho effettuato il check out da un vecchio commit, si verifica lo stesso problema.

Puoi raggiungere quell'opzione da Finestra-> Progetti.


9

Per me è stato perché ho dimenticato di aggiungerlo alle impostazioni di build di Target.

inserisci qui la descrizione dell'immagine


Questo può essere utile se lo hai aggiunto solo alle impostazioni di compilazione del progetto.
zekel

9

"dobbiamo dire a Xcode dove cercare i file di intestazione che stiamo elencando nella nostra intestazione di collegamento . Trova la sezione Percorsi di ricerca e modifica l'impostazione a livello di progetto per Percorsi di ricerca intestazione utente , aggiungendo una voce ricorsiva per i" Pod " directory: Pods / ** " http://swiftalicio.us/2014/11/using-cocoapods-from-swift/


6

Ho anche riscontrato questo problema e purtroppo è solo un bug nell'SDK + Xcode. Ho parlato con un ingegnere al WWDC, di questo e di alcuni altri problemi che stavo avendo con CloudKit. Questi bug verranno risolti nel prossimo seed di Xcode.

È la parte divertente dell'utilizzo del software beta.


1
Sì, è frustrante. Il mio team e io stavamo lavorando per cercare di capire un problema NSURL con CloudKit e non siamo riusciti a capire perché stavamo ricevendo errori, si è scoperto che era un problema lato server di Apple. non potevamo nemmeno fare nulla. perso così tanto tempo. haha.
douglas bumby

5
Il problema può essere effettivamente risolto posizionando l'intestazione nella posizione corretta. Ciò che ha funzionato per me è stato chiamare l'intestazione Project-Bridging-Header.he posizionarlo nella radice dell'albero delle cartelle del mio progetto (come fratello del mio file di progetto Xcode principale). Vedi risposta @ renan-kosicki
jb

1
Risolto in un aggiornamento Xcode, questo era causato da un problema con le prime beta.
douglas bumby

3

per altri che hanno problemi ad aggiungere la classe rapida al progetto obiettivo-c. questo è ciò che funziona per me:

  1. creare un NUOVO file rapido. questo farà sì che xcode ti chieda se vuoi che xcode crei tutte le impostazioni per il progetto mix swift-goal-c incluso brigde-header.h per te. premere sì.
  2. ora, aggiungi i file swift esistenti che desideri utilizzare nel tuo progetto.
  3. nel file di implementazione utilizzerai la classe swift aggiungi: #import "YOURPROJECTNAME-swift.h". questo file xcode creato per te. se il tuo progetto xcode è myProject, "myProject-swift.h"

e questo è tutto. ora crea la classe swift nel tuo codice come se fosse obiettivo-c.


3

Ho importato alcuni file da file di intestazione bridgin da cocoapods in modo non corretto.

Invece di importare

#import <SomeCocoaPod/SomeCocoaPod.h>

scrissi

#import "SomeCocoaPod.h"

E questo è stato il mio errore ENORME


2

Aggiungi un file Objective-C temporaneo al tuo progetto. Puoi dargli qualsiasi nome tu voglia.

Selezionare Sì per configurare un'intestazione bridging Objective-C.

Elimina il file Objective-C temporaneo appena creato.

Nel file projectName-Bridging-Header.h appena creato, aggiungi questa riga:

"#import <GoogleMaps / GoogleMaps.h>"

Modifica il file AppDelegate.swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    GMSServices.provideAPIKey("AIza....") //iOS API key

    return true
}

Segui il link per un campione completo


2

Per me non è stato selezionare "Copia elementi se necessario" nel percorso di destinazione durante l'aggiunta del framework. È sufficiente aggiungere nuovamente il framework con questa opzione selezionata.


1

Dopo i primi giorni di lotta, sono finalmente riuscito a integrare con successo la registrazione di Facebook alla mia app iOS. Ecco i passaggi (presumo che tu abbia già installato Facebook SDK v4.1 o superiore sulle tue macchine):

  1. Aggiungi i framework di Facebook - FBSDKCoreKit, FBSDKLoginKit al tuo progetto.
  2. Non apportare modifiche alle impostazioni di compilazione poiché FB SDK v4.1 e versioni successive non necessita più di bridging dei file di intestazione.
  3. Importa i file FBSDKCorekit, FBSDKLoginKit in ViewController.swift, AppDelegate.swift
  4. Aggiungi informazioni nella pList come menzionato qui

  5. Crea la tua app. E wohoo! nessun errore in fase di compilazione.


2
Questa risposta sarebbe migliore se includessi i dettagli dalla pagina collegata. Se la pagina collegata cambia o il collegamento smette di funzionare, le persone che leggono questa risposta non sapranno cosa fare quando si imbatteranno nel passaggio 4.
TNT

1

Ho lo stesso problema per motivi diversi, ecco il mio caso in cui costruisco un progetto che richiede l'inclusione del menu diapositiva, sto usando SWRevealViewController lib per approcciarlo

quando importa i file della libreria aggiungo una sottocartella (SWRevealViewController) in File di supporto per i file .h && .m, vengono generati due errori, non è possibile importare bridge e SWRevealViewController.h non viene trovato.

Come lo aggiusto

quando sposto i file direttamente in Supporting Files (elimina la sottocartella), SWRevealViewController.m viene automaticamente aggiunto a Build Phases -> Compile Sources e il problema è scomparso

inserisci qui la descrizione dell'immagine


1

Ho riscontrato questo tipo di errore quando stavo aggiungendo un'estensione Today alla mia app. Il target di build per l'estensione è stato generato con lo stesso nome dell'intestazione di bridging del target di build della mia app. Questo stava portando all'errore, perché l'estensione non vede i file elencati nell'intestazione di bridging della mia app.

L'unica cosa che devi fare è eliminare o modificare il nome dell'intestazione di bridging per l'estensione e tutto andrà bene.

Spero che questo ti aiuti.


0

In realtà ho creato un file OSX Source Objective C vuoto nel progetto (dove si trovano tutti i miei file swift).

Ho aggiunto le importazioni e quindi eliminato il file .m .


0

Tra le altre correzioni, ho riscontrato l'errore quando ho provato a fare Prodotto-> Archivio. Si scopre che avevo questo:

Objective-C Bridging Header
  Debug (had the value)
  Release (had the value)
    Any architecture | Any SDK (this was blank - problem here!)

Dopo averlo impostato nell'ultima riga, ha funzionato.


0

Aveva un problema simile che non poteva essere risolto con nessuna soluzione sopra. Il mio progetto utilizza CocoaPods. Ho notato che insieme agli errori ho ricevuto un avviso con il seguente messaggio:

Uncategorized: Target 'Pods' of project 'Pods' was rejected as an implicit dependency for 'Pods.framework' because its architectures 'arm64' didn't contain all required architectures 'armv7 arm64'

inserisci qui la descrizione dell'immagine

Quindi la soluzione era abbastanza semplice. Per il progetto Pods, cambia il flag Build Active Architecture Only su No e l'errore originale scompare.


0

Impostare Precompile Bridging Header su No risolvi il problema per me.


Perché i voti negativi? È una soluzione legittima per alcune persone. Ho fatto il benchmarking facendo build iterative con questo acceso e spento su un grande progetto e non vedo alcuna differenza (Apple ha visto accelerazioni fino al 30%), ma la quantità di tempo che perdo cancellando i file di build e compilando da zero è sostanziale
Alexandre G
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.