Xcode 6 / Beta 4: Die Verwendung von Bridging-Headern mit Framework-Zielen wird nicht unterstützt

131

Ich habe gerade ein Upgrade auf Xcode 6 Beta 4 durchgeführt und ein Framework erstellt, das ich für Live Views in Beta 2 erstellt habe. Aufgrund eines weiteren schnellen Fehlers musste ich einen Obj-C-Code verwenden. Beim Upgrade wird jedoch die folgende Fehlermeldung angezeigt:

Fehler: Die Verwendung von Bridging-Headern mit Framework-Zielen wird nicht unterstützt

Ich habe in den Versionshinweisen nichts gesehen oder einen anderen Migrationspfad gefunden. Hat jemand dies gesehen und eine Lösung gefunden?

Mir ist klar, dass Beta 3 keine Frameworks für Live-Ansichten mehr benötigt, aber in meinem Fall ist es sinnvoll, wenn ich es zum Laufen bringen kann. Ich kann es zwar als Fallback entfernen, würde aber lieber ein Framework verwenden, wenn sie in Beta 4 nicht vollständig kaputt sind.

Chris Conover
quelle
"Mir ist klar, dass Beta 3 die Notwendigkeit von Frameworks beseitigt hat". Wie?
hnh
2
(für Live-Ansichten) - bearbeitet
Chris Conover
1
Ich habe das gleiche Problem.
Simon Germain
2
Wow, Ihre kleine Bearbeitung dort hat mein Leben so viel besser gemacht - ich habe nirgendwo von dieser Änderung gehört (ohne dass Frameworks erforderlich sind) und habe mich stundenlang mit all diesen Framework-Zielen für Live-Ansichten in den Kopf geschlagen. Vielen Dank für dieses @chrisco!
Yonix

Antworten:

232

Wie der Fehler besagt, sind Bridging-Header in Frameworks nicht zulässig. Der Abschnitt zum Importieren von Code aus demselben Framework-Ziel in der Mix & Match- Apple-Dokumentation weist darauf hin. Wie sie sagen, müssen Sie "In Ihre Umbrella-Header-Datei importieren Sie jeden Objective-C-Header, den Sie für Swift verfügbar machen möchten".

Ich habe jedoch festgestellt, dass Sie möglicherweise auch diese spezifischen Header veröffentlichen müssen. In dieser Antwort wird erläutert, warum und wie dies zu tun ist: Schneller Compilerfehler: "Nicht modularer Header im Framework-Modul" .

Also mach das:

  1. Entfernen Sie Ihre Bridging-Header-Datei.
  2. Entfernen Sie Verweise auf die Bridging-Header-Datei in den Build-Einstellungen für das Framework
  3. Fügen Sie die erforderlichen Header zu Ihrer Umbrella-Datei hinzu ([ProductName] .h).
  4. Machen Sie die enthaltenen Dateien im Abschnitt "Header" des Frameworks unter "Build Phases" öffentlich.
  5. Reinigen und wieder aufbauen.

Hinweis : Die "Umbrella-Header-Datei" ist eine Datei (mit dem Namen [ProductName] .h), die im Allgemeinen alle öffentlichen Header eines Frameworks darstellt. Es ist normalerweise nur eine Liste von # import-Anweisungen für andere im Framework enthaltene Header. Wenn Sie in Xcode UIKit.h öffnen, sehen Sie ein gutes Beispiel für eine Umbrella-Datei.

DeepFriedTwinkie
quelle
3
Vielen Dank für die prägnante Antwort (als solche gekennzeichnet). Ich hatte diesen Abschnitt gelesen, war aber verwirrt über die Unterscheidung zwischen Umbrella und Bridging Header.
Chris Conover
1
@ zaxy78 Lesen Sie den Abschnitt "Swift in Objective-C
importieren
4
@DeepFriedTwinkie, auf welche Umbrella-Datei beziehen Sie sich, wenn Sie sagen: "Fügen Sie der Umbrella-Datei die erforderlichen Header hinzu"? Vielen Dank.
Allan Macatingrao
2
Genau das brauchte ich. Das Hinzufügen zum öffentlichen Bereich war das Problem.
OlivaresF
20
Habe ich dann Recht, wenn ich annehme, dass alle Klassen, die ich in meinem Framework privat halten möchte und die von einer schnellen Klasse verwendet werden müssen, jetzt jedem zugänglich gemacht werden müssen, der mein Framework verwendet? Scheint keine ideale Lösung zu sein.
Ospr
28

Es gibt zwei Möglichkeiten. Das Hinzufügen und Veröffentlichen der erforderlichen Header zur Umbrella-Header-Datei ist eine Möglichkeit. Dies ist jedoch ein Problem, wenn die Header für Swift verfügbar, aber nicht öffentlich sein sollen.

Die zweite Möglichkeit, die Swift interne Header zur Verfügung stellt, wird hier ausführlich beschrieben . Im Wesentlichen muss eine Modulzuordnung erstellt werden, die der folgenden ähnelt:

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}

Dies kann dann mit der Einstellung in XCode aufgenommen werden:

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  
Jan Rüegg
quelle
2
Ausgezeichnet! Vielen Dank. Viel bevorzugte Technik gegenüber der Veröffentlichung aller Header.
David H
Raten Sie dieser Lösung
dringend von
Dies ist imo die richtige Antwort, aber je nachdem, was Sie erreichen möchten, können Sie möglicherweise einige von Apple bereitgestellte Makros verwenden, die bei der Interop-Funktion von Swift-Objc sehr hilfreich sind: developer.apple.com/documentation/swift/ …
Joe Susnick
Die headerAnweisung akzeptiert einen relativen Pfad. Was tun Sie, wenn Sie die Header eines anderen Frameworks hinzufügen möchten?
Georgios
13

Siehe Importieren von Objective-C in Swift .

So importieren Sie Objective-C-Code aus demselben Framework in Swift

  1. Stellen Sie unter Build-Einstellungen in Packaging sicher, dass die Einstellung Defines Module für dieses Framework-Ziel auf "Yes" festgelegt ist.
  2. Importieren Sie in Ihrer Umbrella-Headerdatei jeden Objective-C-Header, den Sie für Swift verfügbar machen möchten. Beispielsweise:

        #import "XYZ / XYZCustomCell.h"
        #import "XYZ / XYZCustomView.h"
        #import "XYZ / XYZCustomViewController.h"
    
  3. Machen Sie die enthaltenen Dateien im Abschnitt "Header" des Frameworks unter "Build Phases" öffentlich.

  4. Reinigen und wieder aufbauen.

Swift sieht jeden Header, den Sie öffentlich verfügbar machen, in Ihrem Umbrella-Header. Der Inhalt der Objective-C-Dateien in diesem Framework ist in jeder Swift-Datei innerhalb dieses Framework-Ziels automatisch ohne Importanweisungen verfügbar. Verwenden Sie Ihren benutzerdefinierten Objective-C-Code mit derselben Swift-Syntax, die Sie für Systemklassen verwenden.

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"

Wichtig: Die "Umbrella-Header-Datei" bedeutet die Datei {ModuleName} .h. Übrigens lautet der Zielname {ModuleName} .framework.

Ralph Shane
quelle
1
Ich möchte objc-Dateien in meiner Swift-Datei verwenden, aber ich möchte sie nicht anderen Modulen zugänglich machen. Wie kann ich das machen?
Sazzad Hissain Khan
0

In meinem Fall Objective-C Bridging Headerhat es Build Settingsgeholfen, nur die Einstellungen aus meinem Framework zu entfernen .

Geben Sie hier die Bildbeschreibung ein

Denis Kutlubaev
quelle