Problem beim Importieren von Swift Bridging Header

123

Den Anweisungen folgend habe ich einen Überbrückungsheader erstellt und meinem Projekt hinzugefügt. Leider ist folgender Fehler aufgetreten:

: 0: Fehler: Objective-C-Header '--- Pfad - zu --- Header / .... h' konnte nicht importiert werden

Screenshot 1

In den Build-Einstellungen habe ich dem Speicherort des Bridging-Headers eine Zeichenfolge für den Header-Suchpfad hinzugefügt, aber nichts hat geholfen.

Hat jemand dieses Problem erlebt?

Nikita Pronchik
quelle
Sie können die Header-Datei nicht selbst hinzufügen. Verwenden Sie die neue Datei .., um eine neue leere Objective-c .m-Datei hinzuzufügen. Dadurch bietet Ihnen xcode eine Header-Bridge-Datei, in der Sie Ihre Importe hinzufügen können. Sie können dann die gerade hinzugefügte .m-Datei löschen
markhunte
Ja, ich habe es sicherlich auch so versucht, aber nichts hat geholfen
Nikita Pronchik
Handelt es sich um ein neues Projekt oder um dasselbe, das Sie von Hand gemacht haben?
Markhunte
Es ist ein neues Projekt, ich habe Keychain Support Wrapper hinzugefügt, den ich einmal auf OBJC
Nikita Pronchik
Es tut uns leid. Ich bin mir nicht sicher, was Sie mit dem hinzugefügten Keychain-Support-Wrapper meinen. Aber ich merke , Sie sind auf iOS bekommt man das gleiche mit einem OSX - Projekt , das ist das, was ich unter Verwendung worden
markhunte

Antworten:

153

Achten Sie darauf, die Datei dem Ordner hinzuzufügen, über den sich Ihr Fehler beschwert! Ich habe den gleichen Fehler gemacht. Wenn Sie die Datei aus Xcode erstellen, wird sie in den Ordner "Projekt-> Projekt-> Header.h" verschoben

Und Xcode sucht nach Project-> Header.h

Das heißt, Sie müssen die Datei in Ihrem Projektordner ablegen (ProjectName-> ProjectNameFolder)!

Hoffentlich hilft das ;)

AKTUALISIERT: Ich bin nicht sicher, ob ich verstanden habe, was Sie meinen, aber versuchen Sie dies, um Ihr Problem zu lösen:
1. Löschen Sie alle Ihre bisher erstellten Bridging-Dateien.
2. Wählen Sie den Hauptordner des Projekts aus und klicken Sie auf Neue Datei-> iOS-> Header-Datei.
3. Schreiben Sie Ihre Importe in die erstellte Header-Datei.
4. Wählen Sie das Projekt unter Xcode-> Build Settings aus, geben Sie das Suchfeld Bridging ein und geben Sie den Namen Ihrer Header-Datei oder den Pfad dazu in den Schlüssel SWIFT_OBJC_BRIDGING_HEADER ein!

Wenn Sie diese Schritte ausführen, wird Ihre Header-Datei am richtigen Speicherort erstellt!

: D Hoffe das hilft!

Renan Kosicki
quelle
Nun, ich habe gerade diese Methode ausprobiert, der Header ist wirklich sichtbar, aber leider sind Bridging-Obj-C-Klassen immer noch unsichtbar (nachdem sie in den Bridging-Header aufgenommen wurden)
Nikita Pronchik
11
Zuerst lautet die Antwort "Die Datei muss auf die gleiche Ebene von xcodeproj gestellt werden", am Ende "Sicherstellen, dass sich die Datei ... nicht auf derselben Ebene von xcodeproj befindet". Warum?
Boon
3
Ich meinte, dass sich die Datei im Unterordner des Projekts befinden muss, nicht auf derselben Ebene wie xcodeproj. Beispiel: Im Ordner Ihres Projekts befinden sich project, project.xcodeproj und projecttests. Die Datei muss sich im Projektordner befinden :)
Renan Kosicki
5
Ich habe alles versucht, aber nichts funktioniert für mich. Das ist sehr irritierend. Ich arbeite mit Xcode 8 und Swift 3. Können Sie mir helfen
Hardik Shah
1
Ich bin verwirrt, dass Sie sagen: "Das bedeutet, dass Sie die Datei auf die gleiche Ebene von xcodeproj stellen müssen!" aber nachdem Sie gesagt haben "Stellen Sie sicher, dass sich die Datei im Hauptordner des Projekts befindet, nicht auf derselben Ebene von xcodeproj!" welches ist es?
Bakalolo
68

In meinem Fall war dies tatsächlich ein Fehler aufgrund eines Zirkelverweises. Ich hatte eine Klasse in den Bridging-Header importiert, und die Header-Datei dieser Klasse importierte den schnellen Header ( <MODULE_NAME>-Swift.h). Ich habe dies getan, weil ich in der Obj-C-Headerdatei eine Klasse verwenden musste, die in Swift deklariert wurde. Die Lösung bestand darin, einfach das @classDeklarativ zu verwenden.

Im Grunde genommen <MODULE_NAME>-Swift.hlautete der Fehler "Fehler beim Importieren des Bridging-Headers". Der Fehler darüber lautete " Datei nicht gefunden". Darüber war ein Fehler, der auf eine bestimmte Obj-C-Header-Datei (nämlich einen View Controller) zeigte.

Als ich diese Datei inspizierte, bemerkte ich, dass die Datei -Swift.h im Header deklariert war. Durch das Verschieben dieses Imports in die Implementierung wurde das Problem behoben. Also musste ich ein Objekt verwenden, nennen MyObjectwir es in Swift definiert, also habe ich einfach den Header geändert, um zu sagen

@class MyObject;
Daniel Galasko
quelle
1
Das ist albern, aber das Verschieben in die Implementierungsdatei hat auch bei mir funktioniert. Leider brauchte ich es im Header, da meine Klasse einen in einer schnellen Datei definierten Delegaten implementiert. Aber da es obj-c egal ist, ob meine Klasse den Delegierten tatsächlich implementiert, wenn ich ihn weitergebe, werde ich mich damit abfinden. Aber im Idealfall würde es einen anderen Weg geben
Oren
Möglicherweise müssen Sie auch die Importe desjenigen überprüfen, den Sie in den Bridging-Header einfügen. Wenn eine dieser importierten Klassen einen Verweis auf die Datei "-Swift.h" enthält, müssen Sie die Deklaration in die Datei .m verschieben.
Kyle Carruthers
30

Den Pfad finden Sie unter:

Build-Einstellungen / Swift Compiler - Codegenerierung / Objective-C-Bridging-Header

und löschen Sie diese Datei. Dann solltest du in Ordnung sein.

Variadics
quelle
2
Du gewinnst. Ich habe so viel Zeit damit verschwendet. Einfach und effektiv. Xcode macht mit diesem Pfad etwas Verrücktes, wie das Anhängen an $ (SRCROOT) hinter den Kulissen. Ich denke, ein Leerzeichen auf meinem Weg könnte Teil des Problems sein, aber das war die Silberkugel.
Tag
1
Wie löscht man diese Datei?
Jacky Wang
7
In Xcode 8 - anstelle von "Code Generation" in Swift Compiler - General.
Vivek Bansal
Danke, dass du mich
rettest
18

Dies betrifft wahrscheinlich nur einen kleinen Prozentsatz der Menschen, aber in meinem Fall verwendete mein Projekt CocoaPods und einer dieser Pods hatte eine Subspezifikation mit eigenen CocoaPods. Die Lösung bestand darin, Vollwinkelimporte zu verwenden, um auf Dateien in den Sub-Pods zu verweisen.

#import <HexColors/HexColor.h>

Eher, als

#import "HexColor.h"
Kyle Clegg
quelle
2
Was ist der Unterschied?
Daniel Gomez Rico
Das war das Problem für mich. Ich habe "Fehler beim Importieren des Bridging-Headers" und die Fehler "XYZ.h konnte nicht gefunden werden" erhalten. Diese Änderung hat es für mich unter Xcode 6.4 und Swift 1.2 gelöst.
Entalpi
1
@danielgomezrico Eine Anweisung verweist auf die Datei in einem Unterverzeichnis. Der andere zeigt auf eine Datei, die nicht existiert.
Casey Murray
Die Lösung für diesen Fehler bei der Verwendung von CocoaPods bestand darin, die Pod-Installation nach dem Erstellen der neuen Konfiguration einfach erneut auszuführen.
Schreibmaschine
16

Beim Löschen der abgeleiteten Daten wurde das Problem behoben. Selbst wenn ich von einem alten Commit auschecke, tritt das gleiche Problem auf.

Sie erreichen diese Option über Fenster-> Projekte.

M.Othman
quelle
9

Für mich war es, weil ich vergessen habe, es zu den Build-Einstellungen des Ziels hinzuzufügen.

Geben Sie hier die Bildbeschreibung ein

Roland Keesom
quelle
Dies kann hilfreich sein, wenn Sie es nur zu den Build-Einstellungen des Projekts hinzugefügt haben.
Zekel
9

"Wir müssen Xcode mitteilen, wo nach den Header-Dateien gesucht werden soll, die wir in unserem Bridging-Header auflisten . Suchen Sie den Abschnitt Suchpfade und ändern Sie die Einstellung auf Projektebene für Suchpfade für Benutzerkopfzeilen , indem Sie einen rekursiven Eintrag für die 'Pods' hinzufügen. Verzeichnis: Pods / ** " http://swiftalicio.us/2014/11/using-cocoapods-from-swift/

GS
quelle
6

Ich habe auch dieses Problem erlebt und leider ist es nur ein Fehler im SDK + Xcode. Ich habe mit einem Ingenieur bei WWDC über dieses und einige andere Probleme gesprochen, die ich mit CloudKit hatte. Diese Fehler werden im nächsten Startwert von Xcode behoben.

Es macht Spaß, Beta-Software zu verwenden.

Douglas Bumby
quelle
1
Ja, es ist frustrierend. Mein Team und ich haben versucht, ein NSURL-Problem mit CloudKit herauszufinden, und wir konnten nicht herausfinden, warum wir Fehler erhalten haben. Es stellte sich heraus, dass es sich um ein serverseitiges Problem von Apple handelte. wir konnten nicht einmal etwas tun. so viel Zeit verschwendet. Haha.
Douglas Bumby
5
Das Problem kann tatsächlich behoben werden, indem der Header an der richtigen Stelle platziert wird. Für mich hat es funktioniert, den Header Project-Bridging-Header.h aufzurufen und im Stammverzeichnis meines Projektordnerbaums abzulegen (als Geschwister meiner Haupt-Xcode-Projektdatei). Siehe @ renan-kosicki Antwort
jb
1
In einem Xcode-Update behoben, wurde dies aufgrund eines Problems mit den frühen Betas verursacht.
Douglas Bumby
3

für andere, die Probleme haben, dem Objective-C-Projekt eine schnelle Klasse hinzuzufügen. Das ist es, was für mich funktioniert:

  1. Erstellen Sie eine neue schnelle Datei. Dadurch wird xcode zur Eingabeaufforderung aufgefordert, wenn xcode alle Einstellungen für das Mix-Swift-Objective-C-Projekt einschließlich brigde-header.h für Sie erstellen soll. Drücken Sie Ja.
  2. Fügen Sie jetzt Ihre vorhandenen schnellen Dateien hinzu, die Sie in Ihrem Projekt verwenden möchten.
  3. In der Implementierungsdatei verwenden Sie die Swift-Klasse add: #import "YOURPROJECTNAME-swift.h". Diese Datei Xcode für Sie erstellen. Wenn Ihr xcode-Projekt myProject ist, dann "myProject-swift.h"

und das ist es. Erstellen Sie nun die schnelle Klasse in Ihrem Code so, als wäre sie objektiv-c.

user1105951
quelle
3

Ich habe in einigen Dateien aus Bridgin-Header-Dateien von Cocoapods nicht richtig importiert.

Anstatt zu importieren

#import <SomeCocoaPod/SomeCocoaPod.h>

Ich hab geschrieben

#import "SomeCocoaPod.h"

Und das war mein RIESIGER Fehler

Nikolay Shubenkov
quelle
2

Fügen Sie Ihrem Projekt eine temporäre Objective-C-Datei hinzu. Sie können ihm einen beliebigen Namen geben.

Wählen Sie Ja, um einen Objective-C-Bridging-Header zu konfigurieren.

Löschen Sie die temporäre Objective-C-Datei, die Sie gerade erstellt haben.

Fügen Sie in der gerade erstellten Datei projectName-Bridging-Header.h die folgende Zeile hinzu:

'#import <GoogleMaps / GoogleMaps.h>'

Bearbeiten Sie die Datei AppDelegate.swift:

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

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

    return true
}

Folgen Sie dem Link für eine vollständige Probe

Atul Kaushik
quelle
2

Für mich war es nicht das Auswählen von "Elemente bei Bedarf kopieren" im Zielpfad, während das Framework hinzugefügt wurde. Fügen Sie das Framework einfach mit dieser Option erneut hinzu.

Daisy R.
quelle
1

Nach den ersten Tagen des Kampfes gelang es mir endlich, die Facebook-Anmeldung erfolgreich in meine iOS-App zu integrieren. Hier sind die Schritte (ich gehe davon aus, dass Sie Facebook SDK v4.1 oder höher bereits auf Ihren Computern installiert haben):

  1. Fügen Sie die Facebook-Frameworks - FBSDKCoreKit, FBSDKLoginKit - unter Ihrem Projekt hinzu.
  2. Nehmen Sie keine Änderungen an den Build-Einstellungen vor, da FB SDK v4.1 und höher keine Bridging-Header-Dateien mehr benötigt.
  3. Importieren Sie die Dateien FBSDKCorekit, FBSDKLoginKit in die Dateien ViewController.swift, AppDelegate.swift
  4. Fügen Sie Informationen in die pList ein, wie hier erwähnt

  5. Erstellen Sie Ihre App. Und wohoo! Keine Fehler bei der Kompilierung.

HITESH AGARWAL
quelle
2
Diese Antwort wäre besser, wenn Sie Details von der verlinkten Seite einfügen würden. Wenn sich die verlinkte Seite ändert oder der Link nicht mehr funktioniert, wissen die Leser dieser Antwort nicht, was sie tun sollen, wenn sie auf Schritt 4 stoßen.
TNT
1

Ich habe das gleiche Problem aus verschiedenen Gründen. Hier ist mein Fall, in dem ich ein Projekt erstelle, für das ein Folienmenü erforderlich ist. Ich verwende die SWRevealViewController-Bibliothek, um dies zu erreichen

Wenn ich die Bibliotheksdateien importiere, füge ich unter Unterstützende Dateien für .h && .m-Dateien einen Unterordner (SWRevealViewController) hinzu. Es werden zwei Fehler ausgelöst, Bridge kann nicht importiert werden und SWRevealViewController.h wird nicht gefunden.

Wie ich es repariere

Wenn ich Dateien direkt in unterstützende Dateien verschiebe (Unterordner löschen), wird SWRevealViewController.m automatisch zu Build Phases -> Compile Sources hinzugefügt, und das Problem ist behoben

Geben Sie hier die Bildbeschreibung ein

Mina Fawzy
quelle
1

Diese Art von Fehler trat auf, als ich meiner App eine Heute-Erweiterung hinzufügte. Das Build-Ziel für die Erweiterung wurde mit demselben Namen als Bridging-Header wie das Build-Ziel meiner App generiert. Dies führte zu dem Fehler, da die Erweiterung die im Bridging-Header meiner App aufgelisteten Dateien nicht sieht.

Das einzige, was Sie tun müssen, ist, den Namen des Bridging-Headers für die Erweiterung zu löschen oder zu ändern, und alles wird in Ordnung sein.

Hoffe, dass dies helfen wird.

Georgi Boyadzhiev
quelle
0

Ich habe tatsächlich eine leere OSX Source Objective C-Datei unter dem Projekt erstellt (wo sich alle meine schnellen Dateien befinden).

Ich habe die Importe hinzugefügt und dann die .m- Datei gelöscht .

zevij
quelle
0

Unter den anderen Korrekturen trat der Fehler auf, als ich versuchte, Produkt-> Archivieren durchzuführen. Es stellte sich heraus, dass ich Folgendes hatte:

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

Nachdem es in dieser letzten Zeile eingestellt wurde, funktionierte es.

Nevster
quelle
0

Hatte ein ähnliches Problem, das mit keiner der oben genannten Lösungen gelöst werden konnte. Mein Projekt verwendet CocoaPods. Ich habe festgestellt, dass ich zusammen mit Fehlern eine Warnung mit der folgenden Meldung erhalten habe:

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'

Geben Sie hier die Bildbeschreibung ein

Die Lösung war also ganz einfach. Ändern Sie für das Pods-Projekt das Flag Nur aktive Architektur erstellen in Nein, und der ursprüngliche Fehler ist verschwunden.

mike.tihonchik
quelle
0

Setzen Sie Precompile Bridging Header auf No, um das Problem für mich zu beheben.

abelhoang
quelle
Warum die Abstimmungen? Für manche Menschen ist es eine legitime Lösung. Ich habe gebenchmarkt tun iterative mit dieser baut auf und ab an einem großen Projekt und sehen keinen Unterschied überhaupt (Apple hat zu 30% speedups gesehen nach oben), aber die Menge an Zeit , die ich verlieren Clearing Build - Dateien und von Grund auf neu ist beträchtlich
Alexandre G