Xcode 6 / Beta 4: l'utilizzo delle intestazioni a ponte con target framework non è supportato


131

Ho appena eseguito l'aggiornamento a Xcode 6 Beta 4 e ho un framework che ho creato per Live Views in Beta 2. A causa di un altro bug rapido , avevo bisogno di usare un po 'di codice Obj-C. Durante l'aggiornamento, tuttavia, viene visualizzato il seguente errore:

errore: l'utilizzo delle intestazioni a ponte con target framework non è supportato

Non ho visto nulla nelle note di rilascio o trovato alcun altro percorso di migrazione. Qualcun altro l'ha visto ed è arrivato a una soluzione?

Mi rendo conto che Beta 3 ha eliminato la necessità di framework per le visualizzazioni live, ma nel mio caso ha senso se riesco a farlo funzionare. Posso rimuoverlo però come fallback, ma preferirei usare un framework se non fossero completamente rotti in Beta 4.


"Mi rendo conto che la Beta 3 ha eliminato la necessità di framework". Come?
hnh

2
(per le viste dal vivo) - a cura
Chris Conover

1
Sto riscontrando lo stesso problema.
Simon Germain,

2
Wow, la tua piccola modifica lì mi ha reso la mia vita molto migliore - non ho sentito parlare di questo cambiamento (eliminando la necessità di framework) da nessuna parte e mi batteva la testa con tutti questi obiettivi del framework per le viste dal vivo per ore. Grazie mille per questo @chrisco!
yonix,

Risposte:


232

Come indicato dall'errore, non è consentito il bridging delle intestazioni in Frameworks. Il codice di importazione dall'interno dello stesso framework di destinazione della documentazione Apple Mix & Match suggerisce questo. Come si suol dire, è necessario "Nel file di intestazione ombrello, importare ogni intestazione Objective-C che si desidera esporre a Swift".

Tuttavia, ho scoperto che potrebbe essere necessario rendere pubbliche anche quelle specifiche intestazioni. Questa risposta esamina perché e come farlo: Errore del compilatore Swift: "intestazione non modulare all'interno del modulo framework" .

Quindi, fai questo:

  1. Rimuovi il file di intestazione ponte.
  2. Rimuovere i riferimenti al file di intestazione ponte nelle impostazioni di compilazione per il framework
  3. Aggiungi le intestazioni necessarie al tuo file ombrello ([ProductName] .h)
  4. Rendi pubblici i file inclusi nella sezione "Intestazioni" del framework delle sue "fasi di creazione".
  5. Pulito e ricostruito.

Nota : il "file di intestazione ombrello" è un file (denominato [ProductName] .h) che generalmente rappresenta tutte le intestazioni pubbliche di un framework. Di solito è solo un elenco di istruzioni #import per altre intestazioni contenute nel framework. In Xcode, se apri UIKit.h, vedrai un buon esempio di file ombrello.


3
Grazie per la risposta sintetica (contrassegnata come tale). Avevo letto quella sezione ma ero confuso riguardo alla distinzione tra intestazione Umbrella e Bridging.
Chris Conover,

1
@ zaxy78 controlla la sezione "Importazione di Swift in Objective-C" di questo documento: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
DeepFriedTwinkie

4
@DeepFriedTwinkie, a quale file ombrello fai riferimento quando dici: "Aggiungi le intestazioni necessarie al tuo file ombrello"? Grazie.
Allan Macatingrao,

2
Questo è esattamente ciò di cui avevo bisogno. Aggiungerli alla sezione pubblica era la soluzione.
olivaresF

20
Sono corretto supponendo quindi che eventuali classi che voglio mantenere private nel mio framework che devono essere utilizzate da una classe rapida ora debbano essere rese pubbliche a chiunque usi il mio framework? Non sembra una soluzione ideale.
ospr,

28

Vi sono due possibilità. Aggiungere le intestazioni necessarie al file header dell'ombrello e renderle pubbliche è un modo. Tuttavia, questo è un problema se le intestazioni devono essere disponibili per Swift, ma non sono pubbliche.

La seconda possibilità che renderà disponibili le intestazioni interne a Swift è descritta in dettaglio qui . In sostanza, è necessario creare una mappa del modulo simile alla seguente:

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

Questo può quindi essere incluso in XCode usando l'impostazione:

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  

2
Eccellente! Grazie. La tecnica molto preferita era quella di rendere pubbliche tutte le intestazioni.
David H

Consiglio vivamente questa soluzione contro le altre e di cercare il link fornito per una soluzione dettagliata
Tancrede Chazallet

Questa è la risposta giusta imo ma a seconda di ciò che stai cercando di ottenere potresti essere in grado di cavartela usando alcune macro fornite da Apple che aiutano molto con l'interoperabilità di Swift-Objc: developer.apple.com/documentation/swift/ ...
Joe Susnick,

L' headeristruzione accetta un percorso relativo. Cosa fai quando vuoi aggiungere le intestazioni di un altro framework?
Georgios,

13

Vedi Importazione di Objective-C in Swift .

Per importare il codice Objective-C in Swift dallo stesso framework

  1. In Impostazioni build, in Confezione, assicurarsi che l'impostazione Definisci modulo per quella destinazione del framework sia impostata su "Sì".
  2. Nel file di intestazione ombrello, importa ogni intestazione Objective-C che vuoi esporre a Swift. Per esempio:

        #import "XYZ / XYZCustomCell.h"
        #import "XYZ / XYZCustomView.h"
        #import "XYZ / XYZCustomViewController.h"
    
  3. Rendi pubblici i file inclusi nella sezione "Intestazioni" del framework delle sue "fasi di creazione".

  4. Pulito e ricostruito.

Swift vedrà ogni intestazione che esponi pubblicamente nell'intestazione dell'ombrello. Il contenuto dei file Objective-C in quel framework sarà disponibile automaticamente in qualsiasi file Swift all'interno di quel target framework, senza alcuna dichiarazione di importazione. Usa il tuo codice Objective-C personalizzato con la stessa sintassi Swift che usi con le classi di sistema.

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

Importante: il "file header dell'ombrello" indica il file {ModuleName} .h. A proposito, il nome di destinazione è {ModuleName} .framework.


1
Voglio usare i file objc all'interno dei miei moduli File Swift ma non voglio esporli ad altri moduli. Come posso farlo?
Sazzad Hissain Khan,

0

Nel mio caso è stato utile solo rimuovere le Objective-C Bridging Headerimpostazioni dal mio framework Build Settings.

inserisci qui la descrizione dell'immagine

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.