Swift Bridging Header içe aktarma sorunu


123

Talimatları takiben bir köprüleme başlığı oluşturdum ve projeme ekledim. Maalesef aşağıdaki hata oluştu:

: 0: hata: Objective-C başlığı içe aktarılamadı '--- yol - - - - başlık / .... h'

Ekran görüntüsü 1

Yapı ayarlarında köprüleme başlığının konumuna başlık arama yolu dizesi ekledim, ancak hiçbir şey yardımcı olmadı.

daha once bu problemi yasayan oldu mu?


Başlık dosyasını kendiniz eklemeyi tercih edebilirsiniz. Yeni bir boş Objective-c .m dosyası eklemek için Yeni Dosya .. öğesini kullanın. Bu, xcode'un size içe aktarmalarınızı ekleyebileceğiniz bir başlık köprüsü dosyası sunmasını sağlayacaktır. Daha sonra yeni eklediğiniz .m dosyasını silebilirsiniz
markhunte

Evet, kesinlikle bu yolu da denedim, ama hiçbir şey yardımcı
olmadı

Bu yeni bir projede mi yoksa elle yaptığınızla aynı mı?
markhunte

Yeni bir projede, daha önce OBJC'ye yazdığım Anahtarlık destek paketleyicisini ilan ettim
Nikita Pronchik

Afedersiniz. Eklenen Keychain destek sarmalayıcısı ile ne demek istediğinizden emin değilim. Ama iOS'ta olduğunuzu fark ettim, benim de kullandığım bir OSX projesiyle aynı şeyi mi elde ediyorsunuz
markhunte

Yanıtlar:


153

Dosyayı, hatanızın şikayet ettiği klasöre eklemeye dikkat edin! Ben de aynı hatayı yaptım, eğer dosyayı Xcode'dan oluşturursanız, şu klasöre gidecek: Proje-> Proje-> Header.h

Ve Xcode Project-> Header.h'yi arıyor

Bu, dosyayı proje klasörünüzün (ProjeAdı-> ProjeAdıKlasörü) içine koymanız gerektiği anlamına gelir!

Umarım yardımcı olur ;)

GÜNCELLENDİ: Ne demek istediğinizi anladığımdan emin değilim, ancak sorununuzu çözmek için şunu deneyin:
1. Şimdiye kadar oluşturduğunuz tüm köprüleme dosyalarınızı silin.
2. Projenin ana klasörünü seçin ve yeni dosya-> iOS-> Başlık dosyasına tıklayın.
3. İçe aktarımlarınızı oluşturulan başlık dosyasına yazın.
4. Xcode-> Build Settings içindeki projeyi seçin, arama alanına yazın: köprü oluşturma ve SWIFT_OBJC_BRIDGING_HEADER anahtarını başlık dosyanızın adını veya yolunu girin!

Bu adımları izlerseniz, başlık dosyanız doğru konumda oluşturulacaktır!

: D Umarım yardımcı olur!


Eh, bu yöntemi yeni denedim, başlık gerçekten görünür durumda, ancak maalesef Obj-C sınıflarını köprülemek hala görünmez (köprüleme başlığına dahil ettikten sonra)
Nikita Pronchik

11
İlk başta yanıt "Dosyayı xcodeproj ile aynı seviyeye koymanız gerekiyor" diyor, sonunda "dosyanın xcodeproj ile aynı seviyede olmadığından emin olun" diyor. Neden?
Boon

3
Dosyanın xcodeproj ile aynı seviyede değil, projenin alt klasöründe yer alması gerektiğini kastettim. Örnek: Projenizin klasöründe proje, project.xcodeproj ve proje testleri var. Dosya proje klasörünün içinde olmalıdır :)
Renan Kosicki

5
Her şeyi denedim ama nothnig benim için çalışmıyor. Bu çok rahatsız edici. Xcode 8 ve swift 3 ile çalışıyorum. Bana yardım edebilir misin
Hardik Shah

1
Kafam karıştı, "Bu, dosyayı xcodeproj ile aynı seviyeye koymanız gerektiği anlamına geliyor!" ancak "Dosyanın projenin ana klasörünün içinde bulunduğundan emin olun, xcodeproj ile aynı seviyede olmadığından emin olun!" Hangisi o?
bakalolo

68

Benim durumumda bu aslında döngüsel bir referansın sonucu olarak bir hataydı. Köprüleme başlığında içe aktarılan bir sınıfım vardı ve bu sınıfın başlık dosyası swift başlığını ( <MODULE_NAME>-Swift.h) içe aktarıyordu . Bunu yapıyordum çünkü Obj-C başlık dosyasında Swift'de bildirilen bir sınıfı kullanmam gerekiyordu, çözüm basitçe @classbildirimi kullanmaktı .

Yani temelde hata "Köprüleme başlığı içe aktarılamadı", üstündeki hata ise <MODULE_NAME>-Swift.hdosyanın bulunmadığını, yukarıda belirli bir Obj-C Başlık dosyasına (yani View Controller) işaret eden bir hata olduğunu söyledi .

Bu dosyayı incelerken, -Swift.h dosyasının üstbilgi içinde bildirildiğini fark ettim. Bu içe aktarmayı uygulamaya taşımak sorunu çözdü. Bu yüzden bir nesneyi kullanmam gerekiyordu, onu MyObjectSwift'de tanımlı olarak adlandıralım , bu yüzden başlığı değiştirerek

@class MyObject;

1
Bu aptalca ama onu uygulama dosyasına taşımak benim için de çalıştı. Maalesef buna başlıkta ihtiyacım vardı çünkü sınıfım hızlı bir dosyada tanımlanan bir temsilci uyguluyor. Ancak obj-c, sınıfımın delegeyi ben teslim ettiğimde gerçekten uygulayıp uygulamadığını umursamadığından, bununla ilgileneceğim. Ama ideal olarak başka bir yol olabilirdi
Oren

Ayrıca köprü başlığına getirdiğinizin ithalatını da kontrol etmeniz gerekebilir. Bu içe aktarılan sınıflardan herhangi birinin "-Swift.h" dosyasına bir başvurusu varsa, bildirimi .m dosyasına taşımanız gerekir.
Kyle Carruthers

30

Yolu şurada bulun:

Derleme Ayarları / Swift Derleyici - Kod Oluşturma / Objective-C Köprüleme Başlığı

ve bu dosyayı silin. O zaman iyi olmalısın.


2
Sen kazandın. Bunun için çok zaman harcadım. Basit ve etkili. Xcode, bu yolda, onu sahne arkasına $ (SRCROOT) eklemek gibi garip bir şey yapıyor. Bence yolumda bir boşluk olması sorunun bir parçası olabilir ama bu sihirli değnekdi.
jday

1
o dosyayı nasıl silersiniz?
Jacky Wang

7
Xcode 8'de - "Kod Üretimi" yerine Swift Compiler - Genel'de bulunur.
Vivek Bansal

Teşekkürler beni kurtardın ... Çok teşekkürler
Vijay Rathod

18

Bu muhtemelen insanların yalnızca küçük bir yüzdesini etkileyecektir, ancak benim durumumda projem CocoaPods kullanıyordu ve bu bölmelerden birinin kendi CocoaPod'ları olan bir alt spesifikasyonu vardı. Çözüm, alt bölmelerdeki herhangi bir dosyaya başvurmak için tam açılı içe aktarma kullanmaktı.

#import <HexColors/HexColor.h>

Ziyade

#import "HexColor.h"

2
Fark ne?
Daniel Gomez Rico

Benim için sorun buydu. "Bridging başlığı içe aktarılamadı" ve "XYZ.h bulunamadı" hataları aldım. Bu değişikliği yapmak sorunu benim için Xcode 6.4 ve Swift 1.2'de çözdü.
Entalpi

1
@danielgomezrico Bir ifade, bir alt dizindeki dosyayı işaret ediyor. Diğeri var olmayan bir dosyaya işaret ediyor.
Casey Murray

CocoaPods'u kullanırken bu hatanın çözümü, yeni yapılandırmayı oluşturduktan sonra pod yüklemeyi tekrar çalıştırmaktı.
daktilo

16

Türetilen verileri silmek benim için düzeltildi, eski bir işlemden kontrol etsem bile aynı sorun olduğunu fark ettim.

Bu seçeneğe Pencere-> Projeler'den ulaşabilirsiniz.


9

Benim için bunun nedeni, onu Hedefin Oluşturma Ayarlarına eklemeyi unutmuş olmamdı.

görüntü açıklamasını buraya girin


Bu, yalnızca projenin derleme ayarlarına eklediyseniz yardımcı olabilir.
zekel

9

" Xcode'a , köprüleme başlığımızda listelediğimiz başlık dosyalarını nerede arayacağımızı söylememiz gerekiyor . Arama Yolları bölümünü bulun ve Kullanıcı Başlığı Arama Yolları için proje düzeyindeki ayarı değiştirerek 'Bölmeler' için yinelemeli bir giriş ekleyerek dizin: Bölmeler / ** " http://swiftalicio.us/2014/11/using-cocoapods-from-swift/


6

Bu sorunu da yaşadım ve ne yazık ki bu sadece SDK + Xcode'da bir hata. WWDC'deki bir mühendisle bu ve CloudKit ile yaşadığım diğer birkaç sorun hakkında konuştum. Bu hatalar bir sonraki Xcode tohumunda ele alınacaktır.

Beta yazılımı kullanmanın eğlenceli kısmı.


1
Evet, sinir bozucu. Ekibim ve ben CloudKit ile ilgili bir NSURL problemini çözmeye çalışıyorduk ve neden hata aldığımızı anlayamadık, bunun apple'ın sunucu tarafında bir problem olduğu ortaya çıktı. hiçbir şey yapamadık bile. çok zaman harcadı. haha.
douglas bumby

5
Sorun aslında başlık doğru konuma yerleştirilerek çözülebilir. Benim için işe yarayan, Project-Bridging-Header.h başlığını çağırmak ve bunu proje klasör ağacımın köküne (ana Xcode proje dosyamın bir kardeşi olarak) yerleştirmek. @ Renan-kosicki cevabına bakın
jb

1
Bir Xcode güncellemesinde düzeltildi, bu, erken betalarla ilgili bir sorundan kaynaklanıyordu.
douglas bumby

3

hızlı sınıfını objektif-c projesine eklemekte zorlananlar için. benim için çalışan bu:

  1. YENİ hızlı dosya oluşturun. bu, xcode'un sizin için brigde-header.h dahil olmak üzere mix swift-objektif-c projesi için tüm ayarları oluşturmasını istiyorsanız, xcode'un sormasını sağlar. evet'e basın.
  2. şimdi, projenizde kullanmak istediğiniz mevcut hızlı dosyalarınızı ekleyin.
  3. uygulama dosyasında swift sınıfını kullanacaksınız add: #import "YOURPROJECTNAME-swift.h". bu dosya xcode sizin için yaratır. xcode projeniz myProject ise "myProject-swift.h"

ve bu kadar. şimdi, kodunuzda objektif-c gibi swift sınıfını oluşturun.


3

Bazı dosyaları bridgin başlık dosyalarından cocoapod'lardan düzgün bir şekilde ithal etmedim.

İçe aktarmak yerine

#import <SomeCocoaPod/SomeCocoaPod.h>

yazdım

#import "SomeCocoaPod.h"

Ve bu benim büyük hatamdı


2

Projenize geçici bir Objective-C dosyası ekleyin. Ona istediğiniz ismi verebilirsiniz.

Bir Objective-C köprüleme başlığını yapılandırmak için Evet'i seçin.

Yeni oluşturduğunuz geçici Objective-C dosyasını silin.

Yeni oluşturulan projectName-Bridging-Header.h dosyasında şu satırı ekleyin:

'#import <GoogleMaps / GoogleMaps.h>'

AppDelegate.swift dosyasını düzenleyin:

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

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

    return true
}

Tam örnek için bağlantıyı izleyin


2

Benim için çerçeveyi eklerken hedef yolda 'Gerekirse öğeleri kopyala' seçeneğini seçmiyordu. Bu seçenek seçiliyken çerçeveyi yeniden eklemeniz yeterlidir.


1

İlk birkaç günlük mücadeleden sonra, nihayet Facebook kaydını iOS uygulamama başarıyla entegre etmeyi başardım. İşte adımlar (makinelerinize Facebook SDK v4.1 veya üstünü zaten yüklediğinizi varsayıyorum):

  1. Facebook çerçevelerini - FBSDKCoreKit, FBSDKLoginKit'i projenizin altına ekleyin.
  2. FB SDK v4.1 ve üzeri artık başlık dosyalarının köprülenmesine gerek duymadığından, Yapı ayarlarında değişiklik yapmayın.
  3. FBSDKCorekit, FBSDKLoginKit'i ViewController.swift, AppDelegate.swift dosyalarında içe aktarın
  4. Burada belirtildiği gibi pList'e bilgi ekleyin

  5. Uygulamanızı oluşturun. Ve wohoo! derleme zamanı hatası yok.


2
Bağlantılı sayfadan ayrıntıları eklerseniz bu yanıt daha iyi olur. Bağlantı verilen sayfa değişirse veya bağlantı çalışmazsa, bu yanıtı okuyan kişiler 4. adıma rastladıklarında ne yapacaklarını bilemeyeceklerdir.
TNT

1

Farklı sebeplerden dolayı aynı sorunu yaşıyorum, işte benim durumum , slayt menüsünün dahil edilmesi gereken bir proje oluşturuyorum, buna yaklaşmak için SWRevealViewController lib kullanıyorum

Kütüphane dosyalarını içe aktardığımda, .h && .m dosyaları için Desteklenen Dosyalar altına alt klasör (SWRevealViewController) eklerim, iki hata veriyor, köprü içe aktarılamıyor ve SWRevealViewController.h bulunamadı.

Nasıl düzeltirim

Dosyaları doğrudan Supporting Files'a taşıdığımda (alt klasörü sil), SWRevealViewController.m otomatik olarak Derleme Aşamaları -> Derleme Kaynakları'na eklendi ve sorun giderildi

görüntü açıklamasını buraya girin


1

Uygulamama Bugün Uzantısı eklerken bu tür bir hatayla karşılaştım. Uzantı için derleme hedefi, uygulamamın derleme hedefiyle aynı köprüleme başlığı adıyla oluşturuldu. Bu, hataya yol açıyordu, çünkü uzantı, uygulamamın köprü başlığında listelenen dosyaları görmüyor.

Yapmanız gereken tek şey, uzantı için köprüleme başlığının adını silmek veya değiştirmek ve her şey yoluna girecek.

Umarım bu yardımcı olur.


0

Aslında proje altında (tüm hızlı dosyalarımın bulunduğu) boş bir OSX Source Objective C dosyası oluşturdum.

İçe aktarımları ekledim ve ardından .m dosyasını sildim .


0

Diğer düzeltmeler arasında, Ürün-> Arşiv yapmaya çalıştığımda hata oluştu. Bu bende olduğu ortaya çıktı:

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

O son satıra ayarladıktan sonra işe yaradı.


0

Yukarıdaki herhangi bir çözümle çözülemeyen benzer bir sorun vardı. Projem CocoaPods kullanıyor. Hataların yanı sıra aşağıdaki mesajla bir uyarı aldığımı fark ettim:

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'

görüntü açıklamasını buraya girin

Yani çözüm oldukça basitti. Kapsüller projesi için Yalnızca Etkin Mimari Oluştur bayrağını Hayır olarak değiştirin ve orijinal hata ortadan kalktı.


0

Set precompile Bridging Başlık için No benim için sorunu çözmek.


Neden olumsuz oylar? Bazı insanlar için yasal bir çözüm. Büyük bir projede bunu açıp kapatarak yinelemeli derlemeler yapmayı kıyasladım ve hiçbir fark görmedim (Apple% 30'a kadar hızlanma gördü), ancak derleme dosyalarını ve sıfırdan derlemeyi temizlerken kaybettiğim süre önemli
Alexandre G
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.