Xcode 6 / Beta 4: çerçeve hedefleriyle köprüleme üstbilgileri kullanmak desteklenmez


131

Xcode 6 Beta 4'e yeni yükselttim ve Beta 2'de Canlı Görüntülemeler için oluşturduğum bir çerçeveye sahibim. Başka bir hızlı hata nedeniyle bazı Obj-C kodu kullanmam gerekiyordu. Yine de yükseltme yaparken aşağıdaki hatayı alıyorum:

hata: çerçeve hedefleriyle köprüleme üstbilgileri kullanmak desteklenmez

Sürüm notlarında hiçbir şey görmedim veya başka bir geçiş yolu bulamadım. Başka biri bunu gördü ve bir çözüme ulaştı mı?

Beta 3'ün canlı görüntüler için çerçeve ihtiyacını ortadan kaldırdığını fark ettim, ancak benim durumumda onu çalıştırabilirsem mantıklı geliyor. Gerçi bir geri dönüş olarak kaldırabilirim, ancak Beta 4'te tamamen bozulmamışsa bir çerçeve kullanmayı tercih ederim.


"Beta 3'ün çerçeve ihtiyacını ortadan kaldırdığını anladım". Nasıl?
hnh

2
(canlı görüntüler için) - düzenlendi
Chris Conover

1
Ben de aynı problemle karşılaşıyorum.
Simon Germain

2
Vay canına, oradaki küçük düzenlemeniz hayatımı çok daha iyi hale getirdi - bu değişikliği hiçbir yerde duymadım (çerçeve ihtiyacını ortadan kaldırarak) ve saatlerce canlı görüntüler için tüm bu çerçeve hedefleriyle kafamı karıştırıyordu. Bunun için çok teşekkür ederim @chrisco!
yonix

Yanıtlar:


232

Hata belirttiği için, Frameworks'de köprü başlıklarına izin verilmez. Aynı Çerçeve Hedef İçinden İçe Kodu bölümüne Mix & Match şuna elma dokümantasyon ipuçları. Dedikleri gibi, "Şemsiye başlık dosyanızda, Swift'e göstermek istediğiniz her Objective-C başlığını içe aktarmanız" gerekir.

Ancak, bu belirli başlıkları da genel yapmanız gerekebileceğini keşfettim. Bu cevap bunun neden ve nasıl yapılacağını gözden geçiriyor : Swift derleyici hatası: "çerçeve modülü içinde modüler olmayan başlık" .

Öyleyse, şunu yapın:

  1. Köprüleme başlık dosyanızı kaldırın.
  2. Çerçeve için derleme ayarlarında köprüleme başlığı dosyasına yapılan başvuruları kaldırın
  3. Şemsiye dosyanıza ([ÜrünAdı] .h) gerekli üstbilgileri ekleyin
  4. Dahil edilen dosyaları çerçevenin "Derleme Aşamaları" nın "Başlıklar" bölümünde herkese açık hale getirin.
  5. Temizleyin ve yeniden inşa edin.

Not : "Şemsiye başlık dosyası", genellikle bir çerçevenin tüm genel başlıklarını temsil eden bir dosyadır ([ÜrünAdı] .h adlı). Genellikle çerçevede bulunan diğer başlıklara #import ifadelerinin bir listesidir. Xcode'da, UIKit.h'yi açarsanız, bir şemsiye dosyasının güzel bir örneğini göreceksiniz.


3
Kısa cevap için teşekkürler (bu şekilde işaretlenmiştir). O bölümü okumuştum ama Umbrella ve Bridging başlığı arasındaki ayrım konusunda kafam karışmıştı.
Chris Conover

1
@ zaxy78, bu belgenin "Swift'i Objective-C'ye Aktarma" bölümüne göz
atın

4
@DeepFriedTwinkie, "Şemsiye dosyanıza gerekli başlıkları ekleyin" dediğinizde hangi şemsiye dosyasını kastediyorsunuz? Teşekkürler.
Allan Macatingrao

2
Bu tam olarak ihtiyacım olan şey. Bunları genel bölüme eklemek çözümdü.
olivaresF

20
Çerçevemde gizli tutmak istediğim ve hızlı bir sınıf tarafından kullanılması gereken sınıfların artık çerçevemi kullanan herkese açık hale getirilmesi gerektiğini varsaymakta haklı mıyım? İdeal bir çözüm gibi görünmüyor.
ospr

29

İki olasılık var. Şemsiye başlık dosyasına gerekli başlıkları eklemek ve bunları herkese açık hale getirmek bir yoldur. Ancak, başlıkların Swift tarafından erişilebilir olması, ancak herkese açık olmaması gerekiyorsa bu bir sorundur.

Dahili başlıkları Swift'in kullanımına sunacak ikinci olasılık burada ayrıntılı olarak açıklanmaktadır . Esasen, aşağıdakine benzer bir modül haritası oluşturulmalıdır:

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

Bu, daha sonra şu ayar kullanılarak XCode'a dahil edilebilir:

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  

2
Mükemmel! Teşekkürler. Tüm başlıkları herkese açık hale getirmek yerine çok tercih edilen teknik.
David H

Bu çözümü diğerlerine karşı şiddetle tavsiye edin ve ayrıntılı çözüm için sağlanan bağlantıya bakın
Tancrede Chazallet

Bu doğru cevap imo, ancak elde etmeye çalıştığınız şeye bağlı olarak, Swift-Objc birlikte çalışmasına çok yardımcı olan bazı Apple tarafından sağlanan makroları kullanarak kurtulabilirsiniz: developer.apple.com/documentation/swift/ …
Joe Susnick

headerİfadesi göreli bir yol kabul eder. Başka bir çerçevenin başlıklarını eklemek istediğinizde ne yaparsınız?
Georgios

13

Bkz. Objective-C'yi Swift'e Aktarma .

Objective-C kodunu aynı çerçeveden Swift'e aktarmak için

  1. Derleme Ayarları altında, Paketlemede, bu çerçeve hedefi için Modül Tanımla ayarının "Evet" olarak ayarlandığından emin olun.
  2. Şemsiye başlık dosyanızda, Swift'e göstermek istediğiniz her Objective-C başlığını içe aktarın. Örneğin:

        #import "XYZ / XYZCustomCell.h"
        #import "XYZ / XYZCustomView.h"
        #import "XYZ / XYZCustomViewController.h"
    
  3. Dahil edilen dosyaları çerçevenin "Derleme Aşamaları" nın "Başlıklar" bölümünde herkese açık hale getirin.

  4. Temizleyin ve yeniden inşa edin.

Swift, genel olarak ifşa ettiğiniz her başlığı şemsiye başlığınızda görecek. Bu çerçevedeki Objective-C dosyalarının içeriği, herhangi bir içe aktarma ifadesi olmadan, o çerçeve hedefi içindeki herhangi bir Swift dosyasında otomatik olarak kullanılabilir olacaktır. Özel Objective-C kodunuzu, sistem sınıflarında kullandığınız Swift sözdizimiyle kullanın.

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

Önemli: "şemsiye başlık dosyası", {ModuleName} .h dosyası anlamına gelir. BTW, hedef adı {ModuleName} .framework.


1
Modüllerimin Swift dosyasında objc dosyalarını kullanmak istiyorum ama onları diğer modüllere maruz bırakmak istemiyorum. Bunu nasıl yapabilirim?
Sazzad Hissain Khan

0

Benim durumumda Objective-C Bridging Header, çerçevemden ayarları kaldırmanın Build Settingsyardımı oldu.

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

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.