Xcode 6 / Beta 4: ไม่รองรับการใช้การเชื่อมโยงส่วนหัวกับเป้าหมายกรอบงาน


131

ฉันเพิ่งอัปเกรดเป็น Xcode 6 Beta 4 และมีเฟรมเวิร์กที่ฉันสร้างขึ้นสำหรับ Live Views ในเบต้า 2 เนื่องจากข้อผิดพลาดอื่น ๆ ที่รวดเร็วฉันจำเป็นต้องใช้รหัส Obj-C เมื่ออัปเกรดฉันได้รับข้อผิดพลาดต่อไปนี้:

ข้อผิดพลาด: ไม่รองรับการใช้การเชื่อมโยงส่วนหัวกับเป้าหมายกรอบงาน

ฉันไม่เห็นอะไรเลยในบันทึกประจำรุ่นหรือไม่พบเส้นทางการย้ายข้อมูลอื่นใด มีใครเห็นสิ่งนี้และมาถึงวิธีแก้ปัญหาหรือไม่?

ฉันตระหนักดีว่าเบต้า 3 ขจัดความจำเป็นในการใช้เฟรมเวิร์กสำหรับไลฟ์วิว แต่มันก็สมเหตุสมผลในกรณีของฉันหากฉันสามารถทำให้มันใช้งานได้ ฉันสามารถลบออกได้แม้ว่าจะเป็นทางเลือก แต่ต้องการใช้เฟรมเวิร์กหากไม่เสียทั้งหมดในเบต้า 4


"ฉันตระหนักดีว่าเบต้า 3 ไม่จำเป็นต้องมีเฟรมเวิร์ค" อย่างไร?
hnh

2
(สำหรับการดูสด) - แก้ไข
Chris Conover

1
ฉันกำลังประสบปัญหาเดียวกัน
Simon Germain

2
ว้าวการแก้ไขเพียงเล็กน้อยของคุณทำให้ชีวิตของฉันดีขึ้นมาก - ไม่ได้ยินเกี่ยวกับการเปลี่ยนแปลงนี้ (ไม่จำเป็นต้องใช้เฟรมเวิร์ก) จากที่ใดเลยและกำลังกระแทกหัวของฉันด้วยเป้าหมายเฟรมเวิร์กเหล่านี้ทั้งหมดสำหรับการดูสดเป็นเวลาหลายชั่วโมง ขอบคุณมากสำหรับ @chrisco นี้!
yonix

คำตอบ:


232

เนื่องจากสถานะข้อผิดพลาดไม่อนุญาตให้ใช้การเชื่อมโยงส่วนหัวในกรอบงาน การนำเข้าจากรหัสภายในกรอบเดียวกันเป้าหมายส่วนหนึ่งของMix & Matchคำแนะนำเอกสารแอปเปิ้ลนี้ ตามที่กล่าวไว้คุณต้อง "ในไฟล์ส่วนหัวร่มของคุณให้นำเข้าส่วนหัว Objective-C ทุกรายการที่คุณต้องการเปิดเผยต่อ Swift"

อย่างไรก็ตามฉันพบว่าคุณอาจต้องทำให้ส่วนหัวเฉพาะเหล่านั้นเป็นแบบสาธารณะด้วยเช่นกัน ความคิดเห็นนี้คำตอบว่าทำไมและวิธีการทำว่าสวิฟท์รวบรวมข้อผิดพลาด: "ไม่มีโมดูลส่วนหัวภายในโมดูลกรอบ"

ทำสิ่งนี้:

  1. ลบไฟล์ส่วนหัวเชื่อมต่อของคุณ
  2. ลบการอ้างอิงไปยังไฟล์ส่วนหัวการเชื่อมต่อในการตั้งค่าการสร้างสำหรับกรอบงาน
  3. เพิ่มส่วนหัวที่จำเป็นในไฟล์ร่มของคุณ ([ProductName] .h)
  4. ทำให้ไฟล์ที่รวมอยู่เป็นสาธารณะในส่วน "ส่วนหัว" ของเฟรมเวิร์กของ "ขั้นตอนการสร้าง"
  5. ทำความสะอาดและสร้างใหม่

หมายเหตุ : "ไฟล์ส่วนหัวร่ม" คือไฟล์ (ชื่อ [ProductName] .h) ซึ่งโดยทั่วไปจะแสดงส่วนหัวสาธารณะทั้งหมดของเฟรมเวิร์ก โดยปกติจะเป็นเพียงรายการคำสั่ง #import ไปยังส่วนหัวอื่น ๆ ที่อยู่ในกรอบ ใน Xcode หากคุณเปิด UIKit.h คุณจะเห็นตัวอย่างไฟล์ร่มที่ดี


3
ขอบคุณสำหรับคำตอบที่กระชับ (ทำเครื่องหมายเช่นนั้น) ฉันได้อ่านหัวข้อนั้นแล้ว แต่รู้สึกสับสนเกี่ยวกับความแตกต่างระหว่างส่วนหัว Umbrella และ Bridging
Chris Conover

1
@ zaxy78 ดูส่วน "การนำเข้า Swift ไปยัง Objective-C" ของเอกสารนี้: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
DeepFriedTwinkie

4
@DeepFriedTwinkie คุณหมายถึงไฟล์ร่มอะไรเมื่อคุณพูดว่า: "เพิ่มส่วนหัวที่จำเป็นในไฟล์ร่มของคุณ" ขอบคุณ
Allan Macatingrao

2
นี่คือสิ่งที่ฉันต้องการ การเพิ่มลงในส่วนสาธารณะเป็นการแก้ไข
olivaresF

20
ฉันถูกต้องหรือไม่ที่สมมติว่าชั้นเรียนใด ๆ ที่ฉันต้องการให้เป็นส่วนตัวในกรอบของฉันที่ต้องใช้โดยคลาสที่รวดเร็วจะต้องเปิดเผยต่อทุกคนที่ใช้กรอบของฉัน ดูเหมือนจะไม่ใช่ทางออกที่ดี
ospr

29

มีความเป็นไปได้สองประการ การเพิ่มส่วนหัวที่จำเป็นลงในไฟล์ส่วนหัวของร่มและทำให้เป็นแบบสาธารณะเป็นวิธีหนึ่ง อย่างไรก็ตามนี่เป็นปัญหาหากส่วนหัวควรพร้อมใช้งานสำหรับ Swift แต่ไม่ใช่แบบสาธารณะ

ความเป็นไปได้ที่สองซึ่งจะทำให้หัวต่อภายในใช้ได้กับสวิฟท์อธิบายไว้ในรายละเอียดที่นี่ โดยพื้นฐานแล้วต้องสร้างแผนผังโมดูลที่คล้ายกับสิ่งต่อไปนี้:

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

จากนั้นสามารถรวมไว้ใน XCode โดยใช้การตั้งค่า:

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  

2
ยอดเยี่ยม ขอบคุณ เทคนิคที่เป็นที่ต้องการมากในการทำให้ส่วนหัวทั้งหมดเป็นแบบสาธารณะ
David H

แนะนำวิธีแก้ปัญหานั้นอย่าง
จริงจัง

นี่เป็นคำตอบที่ถูกต้อง แต่ขึ้นอยู่กับสิ่งที่คุณพยายามจะบรรลุคุณอาจสามารถหลีกเลี่ยงได้โดยใช้มาโครที่ Apple จัดหาให้ซึ่งช่วยได้มากกับการทำงานร่วมกันของ Swift-Objc: developer.apple.com/documentation/swift/ …
Joe Susnick

headerแถลงการณ์ยอมรับทางญาติ คุณจะทำอย่างไรเมื่อต้องการเพิ่มส่วนหัวของกรอบงานอื่น
Georgios

13

ดูการนำเข้า Objective-C ลงในสวิฟท์

ในการนำเข้าโค้ด Objective-C ไปยัง Swift จากกรอบงานเดียวกัน

  1. ภายใต้การตั้งค่าการสร้างในบรรจุภัณฑ์ตรวจสอบให้แน่ใจว่ากำหนดการตั้งค่าโมดูลสำหรับเป้าหมายกรอบงานนั้นตั้งค่าเป็น“ ใช่”
  2. ในไฟล์ส่วนหัวร่มของคุณให้นำเข้าส่วนหัว Objective-C ทั้งหมดที่คุณต้องการเปิดเผยต่อ Swift ตัวอย่างเช่น:

        #import "XYZ / XYZCustomCell.h"
        #import "XYZ / XYZCustomView.h"
        #import "XYZ / XYZCustomViewController.h"
    
  3. ทำให้ไฟล์ที่รวมอยู่เป็นสาธารณะในส่วน "ส่วนหัว" ของเฟรมเวิร์กของ "ขั้นตอนการสร้าง"

  4. ทำความสะอาดและสร้างใหม่

Swift จะเห็นทุกส่วนหัวที่คุณเปิดเผยต่อสาธารณะในส่วนหัวร่มของคุณ เนื้อหาของไฟล์ Objective-C ในเฟรมเวิร์กนั้นจะพร้อมใช้งานในไฟล์ Swift ใด ๆ ภายในเฟรมเวิร์กเป้าหมายโดยอัตโนมัติโดยไม่มีคำสั่งนำเข้าใด ๆ ใช้รหัส Objective-C ที่กำหนดเองของคุณด้วยไวยากรณ์ Swift เดียวกับที่คุณใช้กับคลาสระบบ

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

สำคัญ: "ไฟล์ส่วนหัวร่ม" หมายถึงไฟล์ {ModuleName} .h BTW ชื่อเป้าหมายคือ {ModuleName} .framework


1
ฉันต้องการใช้ไฟล์ objc ภายในไฟล์ Swift ของโมดูลของฉัน แต่ฉันไม่ต้องการเปิดเผยไฟล์เหล่านี้กับโมดูลอื่น ๆ ฉันจะทำเช่นนั้นได้อย่างไร?
Sazzad Hissain Khan

0

ในกรณีของฉันเพียงแค่ลบObjective-C Bridging Headerการตั้งค่าออกจากกรอบความBuild Settingsช่วยเหลือของฉัน

ป้อนคำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.