รับ "file not found" ใน Bridging Header เมื่อนำเข้า Objective-C frameworks ไปยัง Swift project


96

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

อย่างไรก็ตามด้วยเหตุผลบางประการดูเหมือนว่าฉันไม่สามารถรวมเฟรมเวิร์กในไฟล์ Bridging-Header ได้ ฉันได้รับข้อผิดพลาดต่อไปนี้:

BridgingHeader.h:5:9: error: 'Parse/Parse.h' file not found
#import <Parse/Parse.h>
        ^
<unknown>:0: error: failed to import bridging header 'BridgingHeader.h'

สิ่งที่ฉันตรวจสอบ:

  1. "Install Objective-C Compatibility Header" ถูกตั้งค่าเป็น "YES"
  2. เส้นทางการค้นหาส่วนหัวประกอบด้วยเส้นทางไปยังเฟรมเวิร์ก

ฉันแน่ใจว่าฉันพลาดอะไรบางอย่างดังนั้นถ้าใครมีเบาะแสก็จะดีมาก


4
ฉันลืมใส่เส้นทางห้องสมุดในHeader Search Pathsกรณีนี้คำถามช่วยได้: D
Aishwat Singh

คำตอบ:


79

พบวิธีแก้ไข:

  • การตั้งค่า "Objective-C Bridging Header" (aka SWIFT_OBJC_BRIDGING_HEADER) ต้องตั้งไว้ที่ระดับเป้าหมายไม่ใช่ระดับโครงการ อย่าลืมลบค่าการตั้งค่าที่ระดับโครงการ

(สำหรับฉันดูเหมือนว่าเป็นข้อผิดพลาด Xcode เนื่องจากฉันไม่รู้ว่าทำไมจึงแก้ไขได้)


1
นี่เป็นเรื่องแปลกจริงๆฉันมีข้อผิดพลาดเดียวกันและปรากฎว่าฉันมีส่วนหัวที่กำหนดไว้ที่ระดับโครงการ แม้ว่าฉันจะกำหนดไว้ที่ระดับเป้าหมายแล้ว แต่ฉันก็ต้องลบออกจากระดับโครงการเพื่อให้สามารถเพิ่มกรอบงานของบุคคลที่สามได้ ดูเหมือนว่าเป็นข้อผิดพลาด Xcode
Jojodmo

2
@MarcoAlmeida หากคุณมีเป้าหมายการทดสอบให้ลองลบการตั้งค่า "Objective-C Bridging Header" ออกด้วย ก็น่าจะช่วยได้
Davlat Mirmanov

3
เหลือเชื่อ. ขอขอบคุณ.
Darren

1
สวัสดี! มีปัญหาเดียวกันที่นี่ :( แม้ว่าจะไม่ได้รับการแก้ไขด้วยวิธีการที่อธิบายไว้ข้างต้น ...
Mike K

1
สิ่งนี้ใช้ได้ผลสำหรับฉันใน Xcode 9.2 ยังคงไม่ได้รับการแก้ไขหลังจากนั้นหลายปี ...
Oliver Eichhorn

58

ฉันมีปัญหาเดียวกัน ฉันเปลี่ยนการนำเข้าทั้งหมดจาก #import "HMSegmentedControl.h"เป็น #import <HMSegmentedControl/HMSegmentedControl.h>ตัวอย่าง


7
ในการทำงานกับ cocoapods จำเป็นต้องมี ในส่วนหัวของการเชื่อมโยงห้ามนำเข้าพ็อดเป็น #import ผู้ใช้ "abc.h" #import <abc / abc.h> ยกนิ้วให้
NaXir

1
คุณคือเทพเจ้า! ขอบคุณมากสำหรับสิ่งนี้
Alper

ในกรณีของฉันฉันแปลง #import <ios-qr-encoder / UIImage + MDQRCode.h> เป็น #import "UIImage + MDQRCode.h" และใช้งานได้
Mashhadi

คุณคือราชา
Itai Spector

27

ฉันต้องเพิ่มlibไดเร็กทอรีของฉันใน User Header Search Paths:

ทดสอบการตั้งค่าเป้าหมาย - เส้นทางการค้นหาส่วนหัวของผู้ใช้

ในกรณีของฉันlibไดเร็กทอรีมี.aไฟล์ -library และไฟล์ส่วนหัวบางไฟล์ สิ่งเหล่านี้รวมอยู่ในไฟล์ส่วนหัวของการเชื่อมต่อ อย่างไรก็ตามคอมไพเลอร์ที่รวดเร็วจะไม่พบพวกเขา เฉพาะเมื่อฉันเพิ่ม${PROJECT_DIR}/libใน User Header Search Path เท่านั้นที่สร้างเป้าหมายการทดสอบ

(ฉันใช้ Xcode 6.2 บน Mavericks 10.9.5)


1
ฉันสามารถแก้ไขปัญหานี้ได้โดยเพิ่ม Pods / * ในเส้นทางการค้นหาส่วนหัวของเป้าหมายหลัก ที่น่าสนใจคือฉันไม่มีปัญหานี้ก่อนที่จะเพิ่มเฟรมเวิร์ก Swift เป็นการอ้างอิงกับเป้าหมายของฉัน Xcode 7 beta 6.
bizz84

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน ฉันมีกรอบในโครงการของฉันที่มีไลบรารี (.a) ฉันต้องสร้างเส้นทางการค้นหาไปยังส่วนหัวของไลบรารีใน User Header Search Paths
Chris Livdahl

ต้องนำเข้าโฟลเดอร์ Pods / library ด้วยขอบคุณมาก!
thibaut noah

17

เราพบข้อความแสดงข้อผิดพลาดเดียวกันโดยมีสาเหตุที่แตกต่างกันอย่างสิ้นเชิง

ติดตั้ง:

  • เป้าหมายของแอปรหัส Obj-C ทั้งหมด
  • เป้าหมายการทดสอบหน่วยด้วยกรณีทดสอบที่รวดเร็วเพียงครั้งเดียวและส่วนหัวเชื่อมต่อที่อ้างถึงรหัสแอป

เมื่อเราเพิ่มกรณีทดสอบที่รวดเร็วที่สองหลังจากทำความสะอาด (หรือบนเครื่องของเพื่อนร่วมทีม) เราเห็นข้อผิดพลาดนี้เมื่อสร้างเป้าหมายการทดสอบหน่วย

ได้รับการแก้ไขโดยการเพิ่มคลาส Obj-C จำลองให้กับเป้าหมายการทดสอบหน่วย


5
ขอขอบคุณ. สิ่งนี้ใช้งานได้จริงแม้ว่าจะไม่มีเหตุผลก็ตาม

ฉันสามารถลบคลาส Obj-C จำลองได้ในภายหลัง ฉันเดาว่าผลข้างเคียงของโซลูชันนี้คือการสร้างส่วนหัวเชื่อมต่อเฉพาะเป้าหมายการทดสอบซึ่งในทางกลับกัน (ฉันสงสัยว่า) ทำให้ Xcode ไม่สนใจส่วนหัวเชื่อมต่อของแอปพลิเคชันโฮสต์
clozach

ภาคผนวกข้างต้น: หลังจากทำการสร้างใหม่ทั้งหมดฉันเริ่มได้รับข้อผิดพลาดในการแบ่งส่วน 11 ระหว่างการคอมไพล์ หลังจากลองผิดลองถูกปรากฏว่าต้องมีไฟล์ดัมมี่. m อยู่ แต่สามารถว่างได้ บ้า
clozach

การเพิ่มคลาส objc จำลองให้กับเป้าหมายการทดสอบของฉันแก้ไขให้ฉัน!
neoneye

5

หากใช้ cocoapods ให้ลองติดตั้งพ็อดใหม่โดยรันคำสั่งต่อไปนี้

pod install

สิ่งนี้ช่วยฉันตั้งแต่ฉันเพิ่งสร้างการกำหนดค่าใหม่ที่ไม่ได้รวบรวม (ไฟล์เดียวกันไม่พบปัญหา) ในขณะที่การกำหนดค่าอื่น ๆ (Debug และ Release) เป็นไฟล์. pod installดูเหมือนจะจำเป็นสำหรับการกำหนดค่าใหม่ ๆ ที่เพิ่มเข้ามา ...
Mete

5

นี่เป็นเคล็ดลับสำหรับฉัน:

  • โครงการสะอาด
  • ทำความสะอาดโฟลเดอร์สร้าง
  • รีสตาร์ท Xcode

มาพร้อมกับคำตอบทั่วไปที่ไม่ถูกต้องและลองใช้ trics
Nico

เคล็ดลับการตีและลองโดยเฉพาะนี้ต้องใช้ความพยายามน้อยมากดังนั้นจึงไม่ควรลองทำในขณะที่คุณคิดหาวิธีแก้ปัญหาอื่น ๆ ;)
Hlung

1
น่าเศร้าที่เคล็ดลับการตีและลองโดยเฉพาะนี้มักเป็นคำตอบที่ถูกต้องเกินไป
Robert Schmid

5

ข้อผิดพลาดนี้ปรากฏขึ้นเมื่อติดตั้งกับ Cocoapods ไลบรารี CocoaImageHashing ปัญหาคือเส้นทางการค้นหาไม่ถูกต้อง ดังนั้นในระดับเป้าหมายในการตั้งค่าการสร้าง -> เส้นทางการค้นหา -> เส้นทางการค้นหาส่วนหัวเส้นทางจึงสอดคล้องกับโฟลเดอร์ที่ไม่มีอยู่เช่น "$ {PODS_ROOT} / Headers / Public / CocoaImageHashing" เมื่อโครงสร้างโฟลเดอร์ส่วนหัว / สาธารณะ / ไม่มีอยู่จริง ฉันเพิ่มเส้นทาง $ {PODS_ROOT} / CocoaImageHashing แล้วข้อผิดพลาดก็หายไป


4

มันแปลกเล็กน้อย แต่ฉันเดาว่าคุณต้องเพิ่มทรัพยากรในเฟส "Copy Bundle Resources" ของเป้าหมายการทดสอบของคุณเพื่อให้โหลดส่วนหัวทั้งหมดจากเป้าหมายแอปหลักของคุณ ในกรณีของฉันฉันได้เพิ่มmain.storyboardและดูแลข้อผิดพลาด

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


4

สิ่งนี้เกิดขึ้นกับฉันหลังจากเพิ่ม / เปลี่ยนชื่อการกำหนดค่าปัจจุบันและมันก็สมเหตุสมผลดี

ทุกการกำหนดค่าใช้ประโยชน์จาก Configurations Set ที่สร้างโดย cocoapods ดังนั้นสิ่งเหล่านี้จึงต้องตรงกัน

ดังนั้นหากคุณเพิ่ม / เปลี่ยนชื่อการกำหนดค่าสิ่งเหล่านี้จะต้องใช้ชุดการกำหนดค่าที่เหมาะสมและสำหรับการรันpod installนั้น


3

ถ้าช่วยใคร.

ในกรณีของฉันไฟล์ obj-c ของฉันถูกเพิ่มมีโฟลเดอร์อ้างอิง (โฟลเดอร์สีน้ำเงินใน xcode) และส่วนหัวไม่พบ เพิ่งเพิ่มไฟล์ไม่ใช่โฟลเดอร์จาก finder ไปจนถึง xcode และแก้ไข


2

ผมมีปัญหาเดียวกัน. สำหรับฉันเหตุผลก็คือฉันใช้ bridging-header เดียวกันสำหรับทั้ง App และ Today Extension ของฉัน My Today Extension ไม่รวม Parse แต่เนื่องจากถูกกำหนดไว้ใน bridging-header จึงพยายามค้นหา ฉันสร้างส่วนหัวเชื่อมต่อใหม่สำหรับส่วนขยายวันนี้ของฉันและข้อผิดพลาดหายไป


ฟังดูไม่เหมือนปัญหาเดียวกันกับที่ฉันมี ฉันไม่มีส่วนขยายวันนี้ ในกรณีของฉันฉันใช้ส่วนหัวเชื่อมต่อสำหรับแอปและกรอบการแยกวิเคราะห์รวมอยู่ในการอ้างอิงแอป ข้อผิดพลาดยังเกิดขึ้นกับเฟรมเวิร์กอื่น ๆ ด้วยไม่ใช่แค่แยกวิเคราะห์
Dia Kharrat

2

เฟรมเวิร์กของฉันใช้งานได้ก่อนหน้านี้และหยุดทำงานกะทันหันและไม่มีคำตอบใดที่เหมาะกับฉัน ฉันลบเฟรมเวิร์กในขั้นตอนการสร้าง> เชื่อมโยงไบนารีกับไลบรารีและเพิ่มเข้าไปใหม่ เริ่มทำงานอีกครั้ง.


2

ฉันพบปัญหาและได้รับการแก้ไขหลังจากใช้เวลา 2 ชั่วโมงในการค้นหา สภาพแวดล้อมของฉันดังต่อไปนี้:

cocoapod 0.39.0

รวดเร็ว 2.x

XCode 7.3.1

ขั้นตอน:

  1. เส้นทางโครงการ: project_name / project_name / your_bridging_header.h
  2. ในส่วน Swift ที่การตั้งค่า Build Objective-C Bridging Header ควรเป็น: project_name / your_bridging_header.h
  3. ในyour_bridging_header.hเปลี่ยนการประกาศทั้งหมดจาก. hเป็น#import
  4. ในชั้นเรียนที่จะถูกใช้your_3rd_party ประกาศนำเข้า your_3rd_party

คำตอบของคุณถูกต้องเพียงเพิ่มคำตอบ @jamesthakid ในจุดที่สามเพื่อให้ชัดเจนยิ่งขึ้น ทำงานให้ฉันขอบคุณ
NaXir

5
"เปลี่ยนการประกาศทั้งหมดจาก. h เป็น #import" หมายความว่าอย่างไร
Chris Gunawardena

2

(อัปเดต ณ วันที่ 27 พฤษภาคม 2560)

Xcode 8. Swift Project - การนำเข้า Objective C.

สิ่งที่ควรรู้:

  1. ต้องบันทึกไฟล์ส่วนหัวที่เชื่อมโยงไว้ในโฟลเดอร์ของโครงการ (กล่าวคือไม่ได้บันทึกไว้ในระดับเดียวกับที่บันทึก. xcodeproj แต่จะลงไปอีกระดับหนึ่งในโฟลเดอร์ที่บันทึกไฟล์ c ที่รวดเร็วและวัตถุประสงค์ทั้งหมดของคุณ) ยังคงสามารถค้นหาไฟล์ที่ระดับบนสุดได้ แต่จะลิงก์ไม่ถูกต้องและไม่สามารถนำเข้าไฟล์ Objective C ไปยังไฟล์ส่วนหัวของการเชื่อมโยงได้
  2. การเชื่อมโยงไฟล์ส่วนหัวสามารถตั้งชื่ออะไรก็ได้ตราบใดที่เป็นไฟล์ส่วนหัว. h
  3. ตรวจสอบให้แน่ใจว่าเส้นทางใน Build Settings> Swift Compiler - General> Objective C Bridging Header ชี้ไปที่ไฟล์ส่วนหัวที่เชื่อมต่อที่คุณทำไว้อย่างถูกต้อง
  4. สิ่งสำคัญ: หากคุณยัง "ไม่พบ" ให้ลองล้างไฟล์ส่วนหัวที่เชื่อมโยงของคุณก่อนและลบการนำเข้าที่คุณเขียนไว้ในปัจจุบัน ตรวจสอบให้แน่ใจว่าสามารถพบไฟล์ bridging header ได้ก่อนจากนั้นเริ่มเพิ่มวัตถุประสงค์ c อิมพอร์ตลงในไฟล์นั้น ด้วยเหตุผลบางประการจะยกเลิกข้อผิดพลาด "ไม่พบ" เดิมแม้ว่าจะพบข้อผิดพลาด แต่ไม่ชอบการนำเข้าที่คุณพยายามด้วยเหตุผลบางประการ
  5. คุณไม่ควร #import "MyBridgingHeaderFile.h" ในไฟล์ C วัตถุประสงค์ของคุณ นอกจากนี้ยังจะทำให้เกิดข้อผิดพลาด "ไม่พบไฟล์"

1
ทุกจุดเหล่านี้ได้รับการตรวจสอบและยังคงมีปัญหาเดิม :( ควรพิจารณาจุดใดเพิ่มเติมหรือไม่
Amjad Husseini

@AmjadHusseini พยายามล้างไฟล์โครงการของคุณจากนั้นล้างข้อมูลที่ได้รับมาของโครงการของคุณจากนั้นรีสตาร์ท xCode ที่ทำงานร่วมกับฉัน
Mohammad Allam

1

ฉันเพิ่งทำซ้ำโครงร่างที่มีอยู่และเพิ่มการกำหนดค่าอื่นให้กับโครงการ ฉันต้องเพิ่มการกำหนดค่าที่มีชื่อเดียวกันในโปรเจ็กต์ของเฟรมเวิร์กเพื่อให้สร้างในDerivedData/($AppName)/Build/Products/($CONFIGURATION_NAME)โฟลเดอร์เดียวกัน มิฉะนั้นจะไม่ได้สร้างไฟล์. Framework จึงไม่สามารถนำเข้าได้


1

วันนี้ฉันพบปัญหาเดียวกันเมื่อพยายามใช้พ็อดที่เขียนด้วย Objective-C ในโครงการ Swift วิธีแก้ปัญหาข้างต้นดูเหมือนจะไม่ได้ผล

ใน podfile ฉันได้use_frameworks!เขียน แสดงความคิดเห็นในบรรทัดนี้จากนั้นเรียกใช้pod installอีกครั้งเพื่อแก้ไขปัญหานี้ให้ฉันและข้อผิดพลาดก็หายไป


0

ฉันมีปัญหาที่คล้ายกันและมีเพียงวิธีเดียวที่ใช้ได้ผลสำหรับฉัน ฉันลองทุกอย่างที่แนะนำแล้วและฉันรู้ว่าฉันตั้งค่าส่วนหัวเชื่อมต่อได้ดีเพราะฉันมี lib อื่น ๆ ที่ใช้งานได้

เมื่อฉันคัดลอกไลบรารี (ลากและวาง) ลงในโปรเจ็กต์โดยไม่มี Cocoapods หลังจากนั้นฉันสามารถนำเข้าส่วนหัวได้โดยไม่มีข้อผิดพลาด

ฉันใช้ไลบรารี facebook / Shimmer


0

ฉันมีปัญหาคล้ายกันกับพ็อด โดยทั่วไปพยายามเรียกใช้การทดสอบ UI ของฉัน Xcode บ่นเกี่ยวกับพ็อดที่หายไป วิธีแก้ปัญหานี้ง่ายกว่าที่อธิบายไว้ข้างต้นมาก:

  1. ไปที่ไฟล์โครงการ (หลักไม่ใช่เป้าหมาย)
  2. คลิกที่แท็บ "ข้อมูล" (ทางซ้ายสุด)
  3. ตั้งค่าการกำหนดค่าพ็อดที่เหมาะสมสำหรับเป้าหมายการทดสอบ UI (ส่วน "การกำหนดค่า" ใต้ "เป้าหมายการทำให้ใช้งานได้")

ทำงาน!

ฉันพบในกระทู้: https://github.com/CocoaPods/CocoaPods/issues/2695

ฟังดูคล้ายกับข้อบกพร่องของเมล็ดโกโก้ แต่ฉันเห็นเหตุผลว่าทำไมมันถึงดูยุ่งยาก



0

ทำความสะอาดโปรเจ็กต์ทำความสะอาดโฟลเดอร์สร้างรีสตาร์ท Xcode ฉันเพิ่งลบเส้นทางในโครงการ goto> สร้างการตั้งค่า> ค้นหาคำหลัก Swift Compiler - General -> Objective-C Bridging header ทำงานให้ฉัน


0

สิงหาคม 2019

ในกรณีของฉันฉันต้องการใช้โปรโตคอล Swift ในไฟล์ส่วนหัว Objective-C ที่มาจากเป้าหมายเดียวกันและสำหรับสิ่งนี้ฉันจำเป็นต้องใช้การประกาศล่วงหน้าของโปรโตคอล Swift เพื่ออ้างอิงในอินเทอร์เฟซ Objective-C สิ่งเดียวกันนี้ควรจะใช้ได้สำหรับการใช้คลาส Swift ในไฟล์ส่วนหัว Objective-C หากต้องการใช้การประกาศไปข้างหน้าดูตัวอย่างต่อไปนี้จากเอกสารที่รวมคลาส Swift ในส่วนหัวของ Objective-C โดยใช้การประกาศไปข้างหน้า :

// MyObjcClass.h
@class MySwiftClass; // class forward declaration
@protocol MySwiftProtocol; // protocol forward declaration

@interface MyObjcClass : NSObject
- (MySwiftClass *)returnSwiftClassInstance;
- (id <MySwiftProtocol>)returnInstanceAdoptingSwiftProtocol;
// ...
@end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.