Masalah impor Swift Bridging Header

123

Mengikuti instruksi, saya telah membuat header penghubung dan menambahkannya ke proyek saya. Sayangnya, kesalahan berikut terjadi:

: 0: error: tidak dapat mengimpor header Objective-C '--- jalur - ke --- header / .... h'

Tangkapan layar 1

Dalam pengaturan build saya menambahkan string jalur pencarian header ke lokasi header bridging, tetapi tidak ada yang membantu.

Adakah yang pernah menangani masalah ini?

Nikita Pronchik
sumber
Anda dapat menambahkan file header sendiri. Gunakan File Baru .. untuk menambahkan file Objective-c .m kosong baru. Ini akan membuat xcode menawarkan file header-bridge tempat Anda dapat menambahkan impor Anda. Anda kemudian dapat menghapus file .m yang baru saja Anda tambahkan
markhunte
Ya, saya sudah mencoba cara ini juga, tetapi tidak ada yang membantu
Nikita Pronchik
Apakah ini dalam proyek baru atau sama dengan yang Anda lakukan dengan tangan?
markhunte
Ini dalam proyek baru, saya telah memasang pembungkus dukungan Keychain, yang pernah saya tulis di OBJC
Nikita Pronchik
Maaf. Tidak yakin apa yang Anda maksud dengan pembungkus dukungan Keychain yang ditambahkan. Tetapi saya perhatikan Anda menggunakan iOS, apakah Anda mendapatkan hal yang sama dengan proyek OSX yang telah saya gunakan
markhunte

Jawaban:

153

Berhati-hatilah untuk menambahkan file ke folder yang dikeluhkan kesalahan Anda! Saya telah melakukan kesalahan yang sama, jika Anda membuat file dari Xcode, itu akan masuk ke folder: Project-> Project-> Header.h

Dan Xcode sedang mencari Project-> Header.h

Itu berarti Anda harus meletakkan file di dalam folder proyek Anda (ProjectName-> ProjectNameFolder)!

Semoga itu bisa membantu;)

DIPERBARUI: Saya tidak yakin apakah saya mengerti maksud Anda, tetapi coba ini untuk menyelesaikan masalah Anda:
1. Hapus semua file penghubung yang Anda buat sampai sekarang.
2. Pilih folder utama proyek dan tekan file baru-> iOS-> File Header.
3. Tulis impor Anda di file header yang dibuat.
4. Pilih proyek di dalam Xcode-> Bangun Pengaturan, ketik di bidang pencarian: menjembatani dan memasukkan kunci SWIFT_OBJC_BRIDGING_HEADER nama file header Anda atau path ke sana!

Jika Anda mengikuti langkah-langkah ini, file header Anda akan dibuat di lokasi yang benar!

: D Semoga membantu!

Renan Kosicki
sumber
Nah, saya baru saja mencoba metode ini, headernya benar-benar terlihat, tetapi, sayangnya, kelas Obj-C yang menjembatani masih tidak terlihat (setelah memasukkannya ke dalam header bridging)
Nikita Pronchik
11
Pada awalnya jawabannya mengatakan "Perlu meletakkan file pada level yang sama dengan xcodeproj", pada akhirnya, dikatakan "pastikan file tersebut ... tidak pada level yang sama dengan xcodeproj". Mengapa?
Boon
3
Maksud saya, file tersebut harus ditempatkan di dalam de subfolder dari proyek, bukan pada level yang sama dengan xcodeproj. Contoh: Di folder proyek Anda, Anda memiliki project, project.xcodeproj dan projecttests. File tersebut harus berada di dalam folder proyek :)
Renan Kosicki
5
Saya mencoba segalanya tetapi tidak ada yang berhasil untuk saya. Ini sangat menjengkelkan. Saya bekerja dengan xcode 8 dan swift 3. Bisakah Anda membantu saya
Hardik Shah
1
Saya bingung Anda mengatakan "Itu berarti Anda harus meletakkan file pada tingkat yang sama dengan xcodeproj!" tetapi setelah Anda mengatakan "Pastikan bahwa file tersebut terletak di dalam folder utama proyek, bukan di tingkat yang sama dengan xcodeproj!" yang mana?
bakalolo
68

Dalam kasus saya ini sebenarnya adalah kesalahan sebagai akibat dari referensi melingkar. Saya memiliki kelas yang diimpor di header bridging, dan file header kelas itu sedang mengimpor swift header ( <MODULE_NAME>-Swift.h). Saya melakukan ini karena di file header Obj-C saya perlu menggunakan kelas yang dideklarasikan di Swift, solusinya adalah cukup menggunakan @classdeklaratif.

Jadi pada dasarnya kesalahan mengatakan "Gagal mengimpor header penghubung", kesalahan di atasnya mengatakan <MODULE_NAME>-Swift.hfile tidak ditemukan, di atas itu adalah kesalahan yang menunjuk ke file Header Obj-C tertentu (yaitu Pengontrol Tampilan).

Memeriksa file ini saya perhatikan bahwa -Swift.h telah dideklarasikan di dalam header. Memindahkan impor ini ke implementasi menyelesaikan masalah. Jadi saya perlu menggunakan sebuah objek, sebut saja itu MyObjectdidefinisikan di Swift, jadi saya cukup mengubah header untuk mengatakan

@class MyObject;
Daniel Galasko
sumber
1
Ini konyol tapi memindahkannya ke file implementasi juga berhasil untuk saya. Sayangnya saya membutuhkannya di header karena kelas saya mengimplementasikan delegasi yang ditentukan dalam file swift. Tapi karena obj-c tidak peduli apakah kelas saya benar-benar mengimplementasikan delegasi ketika saya meneruskannya, saya akan menyelesaikannya. Tapi idealnya akan ada cara lain
Oren
Anda mungkin juga harus memeriksa impor yang Anda bawa ke header bridging. Jika salah satu kelas yang diimpor tersebut memiliki referensi ke file "-Swift.h", Anda harus memindahkan deklarasi tersebut ke .m.
Kyle Carruthers
30

Temukan jalannya di:

Pengaturan Build / Kompilator Swift Pembuatan Kode / Header Bridging Objective-C

dan hapus file itu. Maka Anda harus baik-baik saja.

variadics
sumber
2
Kamu menang. Saya membuang banyak waktu untuk ini. Sederhana dan efektif. Xcode melakukan sesuatu yang aneh dengan jalur ini, seperti menambahkannya ke $ (SRCROOT) di belakang layar. Saya pikir memiliki ruang di jalur saya bisa menjadi bagian dari masalah tetapi ini adalah peluru peraknya.
jday
1
bagaimana Anda menghapus file itu?
Jacky Wang
7
Di Xcode 8 - alih-alih "Pembuatan Kode", ini ada di Swift Compiler - General.
Vivek Bansal
Terima kasih Anda menyelamatkan saya ... Terima kasih banyak
Vijay Rathod
18

Ini mungkin hanya akan memengaruhi sebagian kecil orang, tetapi dalam kasus saya, proyek saya menggunakan CocoaPods dan salah satu pod tersebut memiliki sub-spesifikasi dengan CocoaPods-nya sendiri. Solusinya adalah dengan menggunakan impor sudut penuh untuk mereferensikan file apa pun di sub-pod.

#import <HexColors/HexColor.h>

Daripada

#import "HexColor.h"
Kyle Clegg
sumber
2
Apa bedanya?
Daniel Gomez Rico
Ini adalah masalah bagi saya. Saya mendapat pesan kesalahan "Gagal mengimpor header penghubung" dan "Tidak dapat menemukan XYZ.h". Membuat perubahan ini menyelesaikannya untuk saya di Xcode 6.4 dan Swift 1.2.
Entalpi
1
@danielgomezrico Satu pernyataan menunjuk ke file di subdirektori. Poin lainnya ke file yang tidak ada.
Casey Murray
Solusi untuk kesalahan ini bagi saya saat menggunakan CocoaPods hanyalah menjalankan pemasangan pod lagi setelah membuat konfigurasi baru.
mesin tik
16

Bagi saya menghapus data turunan memperbaikinya, saya perhatikan bahkan jika saya check out dari komit lama, masalah yang sama terjadi.

Anda dapat mencapai opsi itu dari Window-> Projects.

M.Othman
sumber
9

Bagi saya itu karena saya lupa menambahkannya ke Pengaturan Build Target.

masukkan deskripsi gambar di sini

Roland Keesom
sumber
Ini dapat membantu jika Anda hanya menambahkannya ke pengaturan build proyek.
zekel
9

"kami perlu memberi tahu Xcode di mana mencari file header yang kami cantumkan di header penghubung kami . Temukan bagian Jalur Pencarian, dan ubah setelan tingkat proyek untuk Jalur Penelusuran Header Pengguna , tambahkan entri rekursif untuk 'Pod' direktori: Pods / ** " http://swiftalicio.us/2014/11/using-cocoapods-from-swift/

GS
sumber
6

Saya juga mengalami masalah ini dan sayangnya itu hanya bug di SDK + Xcode. Saya berbicara dengan seorang insinyur di WWDC, tentang ini dan beberapa masalah lain yang saya alami dengan CloudKit. Bug ini akan diatasi di seed Xcode berikutnya.

Ini bagian yang menyenangkan tentang menggunakan perangkat lunak beta.

Douglas bumby
sumber
1
Ya, itu membuat frustrasi. Tim saya dan saya sedang bekerja mencoba untuk mencari tahu masalah NSURL dengan CloudKit dan kami tidak tahu mengapa kami mendapatkan kesalahan, ternyata itu adalah masalah sisi server oleh apple. kami bahkan tidak bisa berbuat apa-apa. membuang banyak waktu. ha ha.
douglas bumby
5
Masalah sebenarnya dapat diselesaikan dengan menempatkan tajuk di lokasi yang benar. Apa yang berhasil bagi saya adalah memanggil header Project-Bridging-Header.h dan menempatkannya di root pohon folder proyek saya (sebagai saudara dari file proyek Xcode utama saya). Lihat jawaban @ renan-kosicki
jb
1
Diperbaiki dalam pembaruan Xcode, ini disebabkan karena masalah dengan beta awal.
douglas bumby
3

untuk orang lain yang kesulitan menambahkan kelas cepat ke dalam proyek objektif-c. inilah yang berhasil untuk saya:

  1. buat file swift BARU. ini akan membuat xcode menjadi prompt jika Anda ingin xcode membuat semua pengaturan untuk proyek mix swift-objektif-c termasuk brigde-header.h untuk Anda. tekan ya.
  2. sekarang, tambahkan file swift yang ada yang ingin Anda gunakan dalam proyek Anda.
  3. dalam file implementasi Anda akan menggunakan kelas swift add: #import "YOURPROJECTNAME-swift.h". xcode file ini buat untuk Anda. jika proyek xcode Anda adalah myProject maka "myProject-swift.h"

dan hanya itu. sekarang buat kelas swift di kode Anda seperti itu objektif-c.

pengguna1105951
sumber
3

Saya mengimpor beberapa file dari file header bridgin dari cocoapods tidak dengan cara yang benar.

Bukannya mengimpor

#import <SomeCocoaPod/SomeCocoaPod.h>

saya menulis

#import "SomeCocoaPod.h"

Dan ini adalah kesalahan BESAR saya

Nikolay Shubenkov
sumber
2

Tambahkan file Objective-C sementara ke proyek Anda. Anda dapat memberinya nama apa pun yang Anda suka.

Pilih Ya untuk mengkonfigurasi header penghubung Objective-C.

Hapus file Objective-C sementara yang baru saja Anda buat.

Di file projectName-Bridging-Header.h yang baru saja dibuat, tambahkan baris ini:

'#import <GoogleMaps / GoogleMaps.h>'

Edit file AppDelegate.swift:

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

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

    return true
}

Ikuti tautan untuk sampel lengkap

Atul Kaushik
sumber
2

Bagi saya itu tidak memilih 'Salin item jika diperlukan' di jalur tujuan sambil menambahkan kerangka kerja. Cukup tambahkan kembali kerangka kerja dengan opsi ini dipilih.

Daisy R.
sumber
1

Setelah beberapa hari awal perjuangan, saya akhirnya berhasil mengintegrasikan pendaftaran Facebook ke aplikasi iOS saya. Berikut langkah-langkahnya (saya asumsikan Anda telah menginstal Facebook SDK v4.1 atau lebih tinggi di komputer Anda):

  1. Tambahkan kerangka kerja Facebook - FBSDKCoreKit, FBSDKLoginKit di bawah proyek Anda.
  2. Jangan mengubah pengaturan Build karena FB SDK v4.1 dan yang lebih baru tidak perlu lagi menjembatani file header.
  3. Impor file FBSDKCorekit, FBSDKLoginKit di ViewController.swift, file AppDelegate.swift
  4. Tambahkan informasi di pList seperti yang disebutkan di sini

  5. Buat aplikasi Anda. Dan wohoo! tidak ada kesalahan waktu kompilasi.

HITESH AGARWAL
sumber
2
Jawaban ini akan lebih baik jika Anda memasukkan detail dari halaman yang ditautkan. Jika halaman tertaut berubah atau tautan berhenti berfungsi, orang yang membaca jawaban ini tidak akan tahu apa yang harus dilakukan ketika mereka menemukan langkah 4.
TNT
1

Saya memiliki masalah yang sama karena alasan yang berbeda, inilah kasus saya, saya membangun proyek yang memerlukan menu slide untuk dimasukkan, saya menggunakan lib SWRevealViewController untuk mendekati itu

ketika saya mengimpor file perpustakaan saya menambahkan sub-folder (SWRevealViewController) di bawah File Pendukung untuk file .h && .m, itu menembakkan dua kesalahan, tidak dapat mengimpor jembatan dan SWRevealViewController.h tidak ditemukan.

Bagaimana saya memperbaikinya

ketika saya memindahkan file ke File Pendukung secara langsung (hapus sub-folder), SWRevealViewController.m secara otomatis ditambahkan ke Build Phases -> Compile Sources dan masalah hilang

masukkan deskripsi gambar di sini

Mina Fawzy
sumber
1

Saya mengalami kesalahan seperti itu, ketika saya menambahkan Ekstensi Hari Ini ke aplikasi saya. Target build untuk ekstensi dibuat dengan nama header penghubung yang sama dengan target build aplikasi saya. Ini menyebabkan kesalahan, karena ekstensi tidak melihat file yang tercantum di header penghubung aplikasi saya.

Satu-satunya hal yang perlu Anda lakukan adalah menghapus atau mengubah nama header penghubung untuk ekstensi dan semuanya akan baik-baik saja.

Semoga ini bisa membantu.

Georgi Boyadzhiev
sumber
0

Saya benar-benar membuat file OSX Source Objective C kosong di bawah proyek (di mana semua file swift saya berada).

Saya menambahkan impor dan kemudian menghapus file .m .

zevij
sumber
0

Di antara perbaikan lainnya, saya mengalami kesalahan ketika saya mencoba melakukan Product-> Archive. Ternyata saya punya ini:

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

Setelah mengaturnya di baris terakhir itu, itu berhasil.

nevster
sumber
0

Memiliki masalah serupa yang tidak dapat diselesaikan dengan solusi apa pun di atas. Proyek saya menggunakan CocoaPods. Saya perhatikan bahwa bersama dengan kesalahan saya mendapat peringatan dengan pesan berikut:

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'

masukkan deskripsi gambar di sini

Jadi solusinya cukup sederhana. Untuk project Pods, ubah flag Build Active Architecture Only menjadi No dan error asli menghilang.

mike.tihonchik
sumber
0

Setel Precompile Bridging Header ke Tidak perbaiki masalah untuk saya.

abelhoang
sumber
Mengapa suara negatif? Ini solusi yang sah bagi sebagian orang. Saya telah melakukan benchmarking untuk melakukan build berulang dengan ini dan mematikannya pada proyek besar dan tidak melihat perbedaan sama sekali (Apple telah melihat hingga 30% percepatan), tetapi jumlah waktu saya kehilangan untuk membersihkan file build dan membangun dari awal sangat besar
Alexandre G