Problema de importación de encabezado de puente rápido

123

Siguiendo las instrucciones, creé un encabezado de puente y lo agregué a mi proyecto. Desafortunadamente, ocurrió el siguiente error:

: 0: error: no se pudo importar el encabezado de Objective-C '--- ruta - a --- encabezado / .... h'

Captura de pantalla 1

En la configuración de compilación, agregué una cadena de ruta de búsqueda de encabezado a la ubicación del encabezado de puente, pero nada ayudó.

¿Alguien ha experimentado este problema?

Nikita Pronchik
fuente
En lugar de agregar el archivo de encabezado usted mismo, podría hacerlo. Use el archivo nuevo ... para agregar un nuevo archivo en blanco de Objective-c .m. Esto hará que xcode le ofrezca un archivo de puente de encabezado donde puede agregar sus importaciones. Luego puede eliminar el archivo .m que acaba de agregar
markhunte
Sí, también he intentado de esta manera, pero nada ayudó
Nikita Pronchik
¿Se trata de un proyecto nuevo o el mismo que hiciste a mano?
markhunte
Está en un nuevo proyecto, he agregado el contenedor de soporte de llavero, que una vez escribí en OBJC
Nikita Pronchik
Lo siento. No estoy seguro de lo que quieres decir con el contenedor de soporte Keychain agregado. Pero me doy cuenta de que estás en iOS, ¿obtienes lo mismo con un proyecto OSX que es lo que he estado usando
Markhunte

Respuestas:

153

¡Tenga cuidado de agregar el archivo a la carpeta porque su error se está quejando! He cometido el mismo error, si crea el archivo desde Xcode, irá a la carpeta: Proyecto-> Proyecto-> Encabezado.h

Y Xcode está buscando Project-> Header.h

¡Eso significa que debe colocar el archivo dentro de su carpeta de proyecto (ProjectName-> ProjectNameFolder)!

Espero que ayude ;)

ACTUALIZADO: No estoy seguro de si entendí lo que quieres decir, pero prueba esto para resolver tu problema:
1. Elimina todos los archivos puente que creaste hasta ahora.
2. Seleccione la carpeta principal del proyecto y presione nuevo archivo-> iOS-> Archivo de encabezado.
3. Escriba sus importaciones en el archivo de encabezado creado.
4. Seleccione el proyecto dentro de Xcode-> Build Settings, escriba en el campo de búsqueda: bridging e ingrese la clave SWIFT_OBJC_BRIDGING_HEADER el nombre de su archivo de encabezado o la ruta hacia él.

Si sigue estos pasos, su archivo de encabezado se creará en la ubicación correcta.

: D Espero que ayude!

Renan Kosicki
fuente
Bueno, acabo de probar este método, el encabezado es realmente visible, pero, desafortunadamente, las clases Obj-C de puente siguen siendo invisibles (después de incluirlas en el encabezado de puente)
Nikita Pronchik
11
Al principio, la respuesta dice "Necesito poner el archivo al mismo nivel de xcodeproj", al final, dice "asegúrese de que el archivo ... no esté en el mismo nivel de xcodeproj". ¿Por qué?
Boon
3
Quise decir que el archivo debe estar ubicado dentro de la subcarpeta del proyecto, no al mismo nivel que xcodeproj. Ejemplo: en la carpeta de su proyecto tiene project, project.xcodeproj y projecttests. El archivo debe estar dentro de la carpeta del proyecto :)
Renan Kosicki
55
Intenté todo pero nada funciona para mí. Esto es muy irritante. Estoy trabajando con xcode 8 y swift 3. ¿Pueden ayudarme?
Hardik Shah
1
Me confunde que dices "¡Eso significa que necesitas poner el archivo al mismo nivel de xcodeproj!" pero después de que dijiste "¡Asegúrate de que el archivo esté ubicado dentro de la carpeta principal del proyecto, no en el mismo nivel de xcodeproj!" ¿cuál es?
bakalolo
68

En mi caso, esto fue en realidad un error como resultado de una referencia circular. Tenía una clase importada en el encabezado de puente, y el archivo de encabezado de esa clase estaba importando el encabezado rápido ( <MODULE_NAME>-Swift.h). Estaba haciendo esto porque en el archivo de encabezado Obj-C necesitaba usar una clase declarada en Swift, la solución era simplemente usar el @classdeclarativo.

Básicamente, el error decía "No se pudo importar el encabezado de puente", el error que se encuentra arriba dijo <MODULE_NAME>-Swift.hque no se encontró el archivo, que fue un error que apuntaba a un archivo de Encabezado Obj-C específico (es decir, un Controlador de Vista).

Al inspeccionar este archivo, noté que tenía el -Swift.h declarado dentro del encabezado. Mover esta importación a la implementación resolvió el problema. Así que necesitaba usar un objeto, llamemoslo MyObjectdefinido en Swift, así que simplemente cambié el encabezado para decir

@class MyObject;
Daniel Galasko
fuente
1
Esto es una tontería, pero moverlo al archivo de implementación también funcionó para mí. Desafortunadamente, lo necesitaba en el encabezado porque mi clase implementa un delegado definido en un archivo rápido. Pero como a obj-c no le importa si mi clase realmente implementa el delegado cuando lo paso, me conformaré con esto. Pero idealmente habría otra forma
Oren
Es posible que también deba verificar las importaciones de la que está trayendo al encabezado de puente. Si alguna de esas clases importadas tiene una referencia al archivo "-Swift.h", tendrá que mover la declaración al .m.
Kyle Carruthers
30

Encuentra el camino en:

Configuración de compilación / Compilador Swift - Generación de código / Encabezado de puente de Objective-C

y eliminar ese archivo. Entonces deberías estar bien.

Variadics
fuente
2
Tú ganas. Perdí mucho tiempo en esto. Simple y efectivo. Xcode está haciendo algo complicado con este camino, como agregarlo a $ (SRCROOT) detrás de escena. Creo que tener un espacio en mi camino podría ser parte del problema, pero esta fue la bala de plata.
Jueves
1
¿Cómo eliminas ese archivo?
Jacky Wang
77
En Xcode 8, en lugar de "Generación de código" está en Swift Compiler - General.
Vivek Bansal
Gracias me salvas ... Muchas gracias
Vijay Rathod
18

Esto probablemente solo afectará a un pequeño porcentaje de personas, pero en mi caso mi proyecto estaba usando CocoaPods y una de esas cápsulas tenía una subespecificación con sus propios CocoaPods. La solución fue utilizar las importaciones de ángulo completo para hacer referencia a cualquier archivo en los sub-pods.

#import <HexColors/HexColor.h>

Más bien que

#import "HexColor.h"
Kyle Clegg
fuente
2
¿Cual es la diferencia?
Daniel Gomez Rico
Este fue el problema para mí. Obtuve "No se pudo importar el encabezado Bridging" y los errores "No se pudo encontrar XYZ.h". Hacer este cambio lo resolvió para mí en Xcode 6.4 y Swift 1.2.
Entalpi
1
@danielgomezrico Una declaración apunta al archivo en un subdirectorio. El otro apunta a un archivo que no existe.
Casey Murray
La solución para este error cuando utilicé CocoaPods fue simplemente ejecutar pod install nuevamente después de crear la nueva configuración.
máquina de escribir
16

Para mí, al eliminar los datos derivados que lo arreglaron, noté que incluso si salgo de una confirmación anterior, sucede el mismo problema.

Puede llegar a esa opción desde Ventana-> Proyectos.

M.Othman
fuente
9

Para mí fue porque olvidé agregarlo a la Configuración de compilación del objetivo.

ingrese la descripción de la imagen aquí

Roland Keesom
fuente
Esto puede ayudar si solo lo ha agregado a la configuración de compilación del proyecto.
zekel
9

"necesitamos decirle a Xcode dónde buscar los archivos de encabezado que estamos enumerando en nuestro encabezado de puente . Busque la sección Rutas de búsqueda y cambie la configuración de nivel de proyecto para Rutas de búsqueda de encabezado de usuario , agregando una entrada recursiva para los 'Pods' directorio: Pods / ** " http://swiftalicio.us/2014/11/using-cocoapods-from-swift/

GS
fuente
6

También he experimentado este problema y lamentablemente es solo un error en el SDK + Xcode. Hablé con un ingeniero en WWDC, sobre este y algunos otros problemas que estaba teniendo con CloudKit. Estos errores se abordarán en la próxima semilla de Xcode.

Es la parte divertida sobre el uso de software beta.

bumby de douglas
fuente
1
Si, es frustrante. Mi equipo y yo estábamos trabajando tratando de resolver un problema de NSURL con CloudKit y no pudimos entender por qué recibíamos errores, resultó que era un problema del lado del servidor de Apple. Ni siquiera pudimos hacer nada. Perdido mucho tiempo. jaja.
douglas bumby
55
El problema se puede resolver colocando el encabezado en la ubicación correcta. Lo que funcionó para mí es llamar al encabezado Project-Bridging-Header.h y colocarlo en la raíz del árbol de carpetas de mi proyecto (como un hermano de mi archivo de proyecto Xcode principal). Ver @ renan-kosicki respuesta
jb
1
Solucionado en una actualización de Xcode, esto se debió a un problema con las primeras versiones beta.
Douglas bumby
3

para otros que tienen problemas para agregar una clase rápida en el proyecto del objetivo-c. Esto es lo que funciona para mí:

  1. crear NUEVO archivo rápido. esto hará que xcode solicite si desea que xcode cree todas las configuraciones para mezclar el proyecto swift-Objective-C, incluido brigde-header.h. presione yes.
  2. ahora, agregue los archivos rápidos existentes que desea usar en su proyecto.
  3. en el archivo de implementación, usará la clase swift add: #import "YOURPROJECTNAME-swift.h". Este archivo xcode crea para usted. si su proyecto xcode es myProject, entonces "myProject-swift.h"

y eso es. ahora cree la clase swift en su código como si fuera el objetivo-c.

usuario1105951
fuente
3

Importé en algunos archivos de archivos de encabezado bridgin de cocoapods que no estaban en una forma adecuada.

En lugar de importar

#import <SomeCocoaPod/SomeCocoaPod.h>

escribí

#import "SomeCocoaPod.h"

Y este fue mi ENORME error

Nikolay Shubenkov
fuente
2

Agregue un archivo temporal Objective-C a su proyecto. Puedes darle el nombre que quieras.

Seleccione Sí para configurar un encabezado de puente de Objective-C.

Elimine el archivo temporal de Objective-C que acaba de crear.

En el archivo projectName-Bridging-Header.h que acaba de crear, agregue esta línea:

'#import <GoogleMaps / GoogleMaps.h>'

Edite el archivo AppDelegate.swift:

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

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

    return true
}

Sigue el enlace para ver la muestra completa

Atul Kaushik
fuente
2

Para mí no estaba seleccionando 'Copiar elementos si es necesario' en la ruta de destino al agregar el marco. Simplemente vuelva a agregar el marco con esta opción seleccionada.

Daisy R.
fuente
1

Después de los primeros días de lucha, finalmente logré integrar con éxito el registro de Facebook en mi aplicación iOS. Estos son los pasos (supongo que ya ha instalado Facebook SDK v4.1 o superior en sus máquinas):

  1. Agregue los marcos de Facebook: FBSDKCoreKit, FBSDKLoginKit en su proyecto.
  2. No realice cambios en la configuración de compilación, ya que FB SDK v4.1 y superior ya no necesitan unir más archivos de encabezado.
  3. Importe el FBSDKCorekit, FBSDKLoginKit en los archivos ViewController.swift, AppDelegate.swift
  4. Agregue información en la lista como se menciona aquí

  5. Crea tu aplicación. Y wohoo! sin errores de tiempo de compilación.

AGARWAL HITESH
fuente
2
Esta respuesta sería mejor si incluyera detalles de la página vinculada. Si la página vinculada cambia o el enlace deja de funcionar, las personas que lean esta respuesta no sabrán qué hacer cuando se encuentren con el paso 4.
TNT
1

Tengo el mismo problema por diferentes razones, aquí está mi caso , construyo un proyecto que necesita que se incluya el menú de diapositivas, estoy usando SWRevealViewController lib para abordar eso

cuando importo los archivos de la biblioteca, agrego una subcarpeta (SWRevealViewController) en Archivos de soporte para archivos .h && .m, activa dos errores, no se puede importar el puente y no se encuentra SWRevealViewController.h.

Como lo arreglo

cuando muevo archivos a Archivos de soporte directamente (eliminar subcarpeta), SWRevealViewController.m se agrega automáticamente a Fases de compilación -> Compilar fuentes y el problema desaparece

ingrese la descripción de la imagen aquí

Mina Fawzy
fuente
1

Experimenté ese tipo de error cuando estaba agregando una extensión Today a mi aplicación. El objetivo de compilación para la extensión se generó con el mismo nombre de encabezado de puente que el objetivo de compilación de mi aplicación. Esto condujo al error, porque la extensión no ve los archivos enumerados en el encabezado de puente de mi aplicación.

Lo único que debe hacer es eliminar o cambiar el nombre del encabezado de puente para la extensión y todo estará bien.

Espero que esto ayude.

Georgi Boyadzhiev
fuente
0

De hecho, creé un archivo OSX Source Objective C vacío bajo el proyecto (donde están todos mis archivos swift).

Agregué las importaciones y luego eliminé el archivo .m .

zevij
fuente
0

Entre las otras correcciones, tuve el error cuando intenté hacer Producto-> Archivo. Resulta que tuve esto:

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

Después de configurarlo en esa última línea, funcionó.

Nevster
fuente
0

Tuvo un problema similar que no se pudo resolver con ninguna de las soluciones anteriores. Mi proyecto usa CocoaPods. Noté que junto con los errores recibí una advertencia con el siguiente mensaje:

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'

ingrese la descripción de la imagen aquí

Entonces la solución fue bastante simple. Para el proyecto Pods, cambie el indicador Construir solo arquitectura activa a No y el error original desapareció.

mike.tihonchik
fuente
0

Configure Precompile Bridging Header en No solucionar el problema para mí.

abelhoang
fuente
¿Por qué los votos negativos? Es una solución legítima para algunas personas. He comparado hacer compilaciones iterativas con esto de vez en cuando en un proyecto grande y no veo ninguna diferencia (Apple ha visto hasta un 30% de aceleración), pero la cantidad de tiempo que pierdo borrando archivos de compilación y construyendo desde cero es sustancial
Alexandre G