Problème d'importation d'en-tête Swift Bridging

123

En suivant les instructions, j'ai créé un en-tête de pontage et ajouté à mon projet. Malheureusement, l'erreur suivante s'est produite:

: 0: erreur: impossible d'importer l'en-tête Objective-C '--- chemin - vers --- en-tête / .... h'

Capture d'écran 1

Dans les paramètres de construction, j'ai ajouté une chaîne de chemin de recherche d'en-tête à l'emplacement de l'en-tête de pontage, mais rien n'a aidé.

Quelqu'un a-t-il eu ce problème?

Nikita Pronchik
la source
Vous pouvez plutôt que d'ajouter vous-même le fichier d'en-tête. Utilisez le nouveau fichier .. pour ajouter un nouveau fichier Objective-c .m vierge. Cela permettra à xcode de vous proposer un fichier de pont d'en-tête dans lequel vous pourrez ajouter vos importations. Vous pouvez ensuite supprimer le fichier .m que vous venez d'ajouter
markhunte
Oui, j'ai essayé de cette façon certainement aussi, mais rien n'a aidé
Nikita Pronchik
Est-ce sur un nouveau projet ou le même que vous avez fait à la main?
markhunte
C'est sur un nouveau projet, j'ai ajouté un wrapper de support de trousseau, que j'ai écrit une fois sur OBJC
Nikita Pronchik
Désolé. Je ne sais pas ce que vous entendez par le wrapper de prise en charge du trousseau ajouté. Mais je remarque que vous êtes sur iOS est-ce que vous obtenez la même chose avec un projet OSX qui est ce que j'utilise
markhunte

Réponses:

153

Veillez à ajouter le fichier dans le dossier que votre erreur se plaint! J'ai fait la même erreur, si vous créez le fichier à partir de Xcode, il ira dans le dossier: Project-> Project-> Header.h

Et Xcode recherche Project-> Header.h

Cela signifie que vous devez placer le fichier dans le dossier de votre projet (ProjectName-> ProjectNameFolder)!

J'espère que cela pourra aider ;)

MISE À JOUR: Je ne sais pas si j'ai compris ce que vous voulez dire, mais essayez ceci pour résoudre votre problème:
1. Supprimez tous vos fichiers de pontage que vous avez créés jusqu'à présent.
2. Sélectionnez le dossier principal du projet et cliquez sur Nouveau fichier-> iOS-> Fichier d'en-tête.
3. Écrivez vos importations dans le fichier d'en-tête créé.
4. Sélectionnez le projet dans Xcode-> Build Settings, tapez dans le champ de recherche: bridging et mettez dans la clé SWIFT_OBJC_BRIDGING_HEADER le nom de votre fichier d'en-tête ou le chemin d'accès!

Si vous suivez ces étapes, votre fichier d'en-tête sera créé à l'emplacement correct!

: D J'espère que cela aide!

Renan Kosicki
la source
Eh bien, je viens d'essayer cette méthode, l'en-tête est vraiment visible, mais, malheureusement, les classes Obj-C de pontage sont toujours invisibles (après les avoir incluses dans l'en-tête de pontage)
Nikita Pronchik
11
Au début, la réponse dit "Il faut mettre le fichier au même niveau que xcodeproj", à la fin, il dit "assurez-vous que le fichier n'est pas au même niveau que xcodeproj". Pourquoi?
Boon
3
Je voulais dire que le fichier doit être situé dans le sous-dossier du projet, pas au même niveau que xcodeproj. Exemple: Dans le dossier de votre projet, vous avez project, project.xcodeproj et projecttests. Le fichier doit être dans le dossier du projet :)
Renan Kosicki
5
J'ai tout essayé mais rien ne fonctionne pour moi. C'est très irritant. Je travaille avec xcode 8 et swift 3. Pouvez-vous m'aider
Hardik Shah
1
Je suis confus que vous dites "Cela signifie que vous devez mettre le fichier au même niveau que xcodeproj!" mais après avoir dit "Assurez-vous que le fichier se trouve dans le dossier principal du projet et pas au même niveau de xcodeproj!" laquelle est-ce?
bakalolo
68

Dans mon cas, il s'agissait en fait d'une erreur résultant d'une référence circulaire. J'avais une classe importée dans l'en-tête de pontage, et le fichier d'en-tête de cette classe importait l'en-tête swift ( <MODULE_NAME>-Swift.h). Je faisais cela parce que dans le fichier d'en-tête Obj-C, je devais utiliser une classe déclarée dans Swift, la solution était simplement d'utiliser le @classdéclaratif.

Donc, fondamentalement, l'erreur disait «Impossible d'importer l'en-tête de pontage», l'erreur au-dessus indiquait que le <MODULE_NAME>-Swift.hfichier était introuvable, au-dessus était une erreur pointant vers un fichier d'en-tête Obj-C spécifique (à savoir un contrôleur de vue).

En inspectant ce fichier, j'ai remarqué qu'il avait le -Swift.h déclaré dans l'en-tête. Le déplacement de cette importation vers l'implémentation a résolu le problème. J'avais donc besoin d'utiliser un objet, appelons-le MyObjectdéfini dans Swift, alors j'ai simplement changé l'en-tête pour dire

@class MyObject;
Daniel Galasko
la source
1
C'est idiot, mais le déplacer vers le fichier d'implémentation a également fonctionné pour moi. Malheureusement, j'en avais besoin dans l'en-tête car ma classe implémente un délégué défini dans un fichier swift. Mais comme obj-c ne se soucie pas de savoir si ma classe implémente réellement le délégué lorsque je le transmet, je vais me contenter de ça. Mais idéalement, il y aurait un autre moyen
Oren
Vous devrez peut-être également vérifier les importations de celui que vous importez dans l'en-tête de pontage. Si l'une de ces classes importées a une référence au fichier "-Swift.h", vous devrez déplacer la déclaration vers le .m.
Kyle Carruthers
30

Trouvez le chemin à:

Paramètres de construction / Compilateur Swift - Génération de code / En-tête de pont Objective-C

et supprimez ce fichier. Alors ça devrait aller.

variadiques
la source
2
Vous gagnez. J'ai perdu tellement de temps là-dessus. Simple et efficace. Xcode fait quelque chose de compliqué avec ce chemin, comme l'ajouter à $ (SRCROOT) dans les coulisses. Je pense qu'avoir un espace sur mon chemin pourrait faire partie du problème, mais c'était la solution miracle.
jday
1
comment supprimez-vous ce fichier?
Jacky Wang
7
Dans Xcode 8 - au lieu de "Code Generation", c'est dans Swift Compiler - General.
Vivek Bansal
Merci, sauvez-moi ... Merci beaucoup
Vijay Rathod
18

Cela n'affectera probablement qu'un petit pourcentage de personnes, mais dans mon cas, mon projet utilisait des CocoaPods et l'un de ces pods avait une sous-spécification avec ses propres CocoaPods. La solution consistait à utiliser des importations d'angle complet pour référencer tous les fichiers dans les sous-pods.

#import <HexColors/HexColor.h>

Plutôt que

#import "HexColor.h"
Kyle Clegg
la source
2
Quelle est la différence?
Daniel Gomez Rico le
C'était le problème pour moi. J'ai eu "Impossible d'importer l'en-tête de pont" et les erreurs "Impossible de trouver XYZ.h". Faire ce changement l'a résolu pour moi sur Xcode 6.4 et Swift 1.2.
Entalpi
1
@danielgomezrico Une instruction pointe vers le fichier dans un sous-répertoire. L'autre pointe vers un fichier qui n'existe pas.
Casey Murray
La solution à cette erreur pour moi lors de l'utilisation de CocoaPods consistait simplement à exécuter à nouveau l'installation du pod après avoir créé la nouvelle configuration.
machine à écrire
16

Pour moi, la suppression des données dérivées a résolu le problème, j'ai remarqué que même si je récupère un ancien commit, le même problème se produit.

Vous pouvez accéder à cette option du formulaire Fenêtre-> Projets.

M.Othman
la source
9

Pour moi, c'était parce que j'avais oublié de l'ajouter aux paramètres de construction de la cible.

entrez la description de l'image ici

Roland Keesom
la source
Cela peut être utile si vous ne l'avez ajouté qu'aux paramètres de construction du projet.
zekel
9

"nous devons indiquer à Xcode où rechercher les fichiers d'en-tête que nous répertorions dans notre en- tête de pontage . Recherchez la section Chemins de recherche et modifiez le paramètre au niveau du projet pour les chemins de recherche d'en-tête utilisateur , en ajoutant une entrée récursive pour les" Pods " répertoire: Pods / ** " http://swiftalicio.us/2014/11/using-cocoapods-from-swift/

GS
la source
6

J'ai également rencontré ce problème et, malheureusement, il ne s'agit que d'un bogue dans le SDK + Xcode. J'ai parlé à un ingénieur de la WWDC, de cela et de quelques autres problèmes que j'avais avec CloudKit. Ces bogues seront résolus dans la prochaine graine de Xcode.

C'est la partie amusante de l'utilisation du logiciel bêta.

Douglas Bumby
la source
1
Ouais, c'est frustrant. Mon équipe et moi travaillions à essayer de résoudre un problème NSURL avec CloudKit et nous ne pouvions pas comprendre pourquoi nous recevions des erreurs, il s'est avéré que c'était un problème côté serveur par Apple. nous ne pouvions même rien faire. perdu tellement de temps. haha.
douglas bumpar
5
Le problème peut en fait être résolu en plaçant l'en-tête au bon emplacement. Ce qui a fonctionné pour moi, c'est d'appeler l'en-tête Project-Bridging-Header.h et de le placer à la racine de l'arborescence des dossiers de mon projet (en tant que frère de mon fichier de projet Xcode principal). Voir @ renan-kosicki answer
jb
1
Corrigé dans une mise à jour Xcode, cela était dû à un problème avec les premières versions bêta.
douglas bumpublié le
3

pour d'autres qui ont des difficultés à ajouter une classe rapide dans le projet objective-c. c'est ce qui fonctionne pour moi:

  1. créer un NOUVEAU fichier swift. Cela fera que xcode vous demandera si vous voulez que xcode crée tous les paramètres pour le projet mix swift-objective-c, y compris brigde-header.h pour vous. appuyez sur oui.
  2. maintenant, ajoutez vos fichiers Swift existants que vous souhaitez utiliser dans votre projet.
  3. dans le fichier d'implémentation, vous allez utiliser la classe swift add: #import "YOURPROJECTNAME-swift.h". ce fichier xcode crée pour vous. si votre projet xcode est myProject alors "myProject-swift.h"

et c'est tout. créez maintenant la classe swift dans votre code comme si c'était objective-c.

user1105951
la source
3

J'ai importé certains fichiers à partir de fichiers d'en-tête bridgin à partir de cocoapodes de manière incorrecte.

Au lieu d'importer

#import <SomeCocoaPod/SomeCocoaPod.h>

J'ai écrit

#import "SomeCocoaPod.h"

Et c'était mon énorme erreur

Nikolay Shubenkov
la source
2

Ajoutez un fichier Objective-C temporaire à votre projet. Vous pouvez lui donner n'importe quel nom.

Sélectionnez Oui pour configurer un en-tête de pontage Objective-C.

Supprimez le fichier Objective-C temporaire que vous venez de créer.

Dans le fichier projectName-Bridging-Header.h que vous venez de créer, ajoutez cette ligne:

'#import <GoogleMaps / GoogleMaps.h>'

Modifiez le fichier AppDelegate.swift:

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

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

    return true
}

Suivez le lien pour un échantillon complet

Atul Kaushik
la source
2

Pour moi, il ne sélectionnait pas «Copier les éléments si nécessaire» dans le chemin de destination lors de l'ajout du cadre. Ajoutez simplement à nouveau le cadre avec cette option sélectionnée.

Daisy R.
la source
1

Après quelques jours de lutte, j'ai finalement réussi à intégrer avec succès l'inscription Facebook à mon application iOS. Voici les étapes (je suppose que vous avez déjà installé Facebook SDK v4.1 ou supérieur sur vos machines):

  1. Ajoutez les frameworks Facebook - FBSDKCoreKit, FBSDKLoginKit sous votre projet.
  2. N'apportez aucune modification aux paramètres de construction car FB SDK v4.1 et supérieur n'a plus besoin de fichiers d'en-tête de pontage.
  3. Importez les fichiers FBSDKCorekit, FBSDKLoginKit dans ViewController.swift, AppDelegate.swift
  4. Ajouter des informations dans la pList comme mentionné ici

  5. Créez votre application. Et wohoo! aucune erreur de compilation.

AGARWAL HITESH
la source
2
Cette réponse serait meilleure si vous incluiez les détails de la page liée. Si la page liée change ou si le lien cesse de fonctionner, les personnes lisant cette réponse ne sauront pas quoi faire lorsqu'elles rencontrent l'étape 4.
TNT
1

J'ai le même problème pour une raison différente, voici mon cas, je construis un projet qui nécessite un menu coulissant pour être inclus, j'utilise SWRevealViewController lib pour aborder cela

lorsque j'importe les fichiers de bibliothèque, j'ajoute un sous-dossier (SWRevealViewController) sous Fichiers de prise en charge pour les fichiers .h && .m, il déclenche deux erreurs, ne peut pas importer le pont et SWRevealViewController.h n'est pas trouvé.

Comment je le répare

lorsque je déplace des fichiers vers Supporting Files directement (supprimer le sous-dossier), SWRevealViewController.m automatiquement ajouté aux phases de construction -> Compiler les sources et le problème est parti

entrez la description de l'image ici

Mina Fawzy
la source
1

J'ai rencontré ce genre d'erreur lorsque j'ajoutais une extension Today à mon application. La cible de build pour l'extension a été générée avec le même nom d'en-tête de pontage que la cible de build de mon application. Cela conduisait à l'erreur, car l'extension ne voit pas les fichiers répertoriés dans l'en-tête de pontage de mon application.

La seule chose dont vous avez besoin est de supprimer ou de modifier le nom de l'en-tête de pontage pour l'extension et tout ira bien.

J'espère que cela aidera.

Georgi Boyadzhiev
la source
0

J'ai en fait créé un fichier OSX Source Objective C vide sous le projet (où se trouvent tous mes fichiers Swift).

J'ai ajouté les importations puis supprimé le fichier .m .

zevij
la source
0

Parmi les autres correctifs, l'erreur est survenue lorsque j'ai essayé de faire Product-> Archive. Il s'avère que j'avais ceci:

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

Après l'avoir mis dans cette dernière ligne, cela a fonctionné.

Nevster
la source
0

Avait un problème similaire qui ne pouvait être résolu par aucune solution ci-dessus. Mon projet utilise CocoaPods. J'ai remarqué qu'avec des erreurs, j'ai reçu un avertissement avec le message suivant:

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'

entrez la description de l'image ici

La solution était donc assez simple. Pour le projet Pods, définissez l' indicateur Construire l'architecture active uniquement sur Non et l'erreur d'origine a disparu.

mike.tihonchik
la source
0

Définissez En-tête de pontage de précompilation sur Non, résolvez le problème pour moi.

Abelhoang
la source
Pourquoi les votes négatifs? C'est une solution légitime pour certaines personnes. J'ai comparé la possibilité de faire des builds itératifs avec ceci par intermittence sur un grand projet et je ne vois aucune différence (Apple a vu jusqu'à 30% d'accélération), mais le temps que je perds pour effacer les fichiers de build et construire à partir de zéro est considérable
Alexandre G