ปัญหาการนำเข้า Swift Bridging Header


123

ทำตามคำแนะนำฉันได้สร้างส่วนหัวเชื่อมต่อและเพิ่มในโครงการของฉันแล้ว ขออภัยเกิดข้อผิดพลาดต่อไปนี้:

: 0: ข้อผิดพลาด: ไม่สามารถนำเข้าส่วนหัวของ Objective-C '--- path - to - header / .... h'

ภาพหน้าจอ 1

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

มีใครประสบปัญหานี้


คุณสามารถเพิ่มไฟล์ส่วนหัวได้ด้วยตัวเอง ใช้ไฟล์ใหม่ .. เพื่อเพิ่มไฟล์ Objective-c .m ว่างใหม่ สิ่งนี้จะทำให้ xcode เสนอไฟล์ส่วนหัวที่คุณสามารถเพิ่มการนำเข้าของคุณได้ จากนั้นคุณสามารถลบไฟล์. m ที่คุณเพิ่งเพิ่มได้
markhunte

ใช่ฉันเคยลองวิธีนี้เช่นกัน แต่ไม่มีอะไรช่วย
Nikita Pronchik

นี่เป็นโครงการใหม่หรือโครงการเดียวกับที่คุณทำด้วยมือ?
markhunte

มันเป็นโปรเจ็กต์ใหม่ฉันได้ใช้กระดาษห่อหุ้มพวงกุญแจซึ่งฉันเคยเขียนไว้ใน OBJC
Nikita Pronchik

ขอโทษ ไม่แน่ใจว่าสิ่งที่คุณหมายถึงของ Wrapper รองรับพวงกุญแจที่เพิ่มเข้ามา แต่ฉันสังเกตว่าคุณใช้ iOS คุณจะได้รับสิ่งเดียวกันกับโปรเจ็กต์ OSX ซึ่งเป็นสิ่งที่ฉันใช้อยู่หรือ
เปล่า

คำตอบ:


153

ระวังเพิ่มไฟล์ไปยังโฟลเดอร์ที่มีข้อผิดพลาดบ่น! ฉันทำผิดพลาดเหมือนกันถ้าคุณสร้างไฟล์จาก Xcode มันจะไปที่โฟลเดอร์: Project-> Project-> Header.h

และ Xcode กำลังมองหา Project-> Header.h

นั่นหมายความว่าคุณต้องวางไฟล์ไว้ในโฟลเดอร์โปรเจ็กต์ของคุณ (ProjectName-> ProjectNameFolder)!

หวังว่าจะช่วย;)

อัปเดตแล้ว: ฉันไม่แน่ใจว่าฉันเข้าใจในสิ่งที่คุณหมายถึงหรือไม่ แต่ลองวิธีนี้เพื่อแก้ปัญหาของคุณ:
1. ลบไฟล์เชื่อมโยงทั้งหมดที่คุณสร้างไว้จนถึงตอนนี้
2. เลือกโฟลเดอร์หลักของโครงการและกดไฟล์ใหม่ -> iOS-> ไฟล์ส่วนหัว
3. เขียนการนำเข้าของคุณในไฟล์ส่วนหัวที่สร้างขึ้น
4. เลือกโปรเจ็กต์ใน Xcode-> Build Settings พิมพ์ในช่องค้นหา: bridging และใส่คีย์ SWIFT_OBJC_BRIDGING_HEADER ชื่อไฟล์ส่วนหัวของคุณหรือพา ธ ไปยังมัน!

หากคุณทำตามขั้นตอนนี้ไฟล์ส่วนหัวของคุณจะถูกสร้างขึ้นในตำแหน่งที่ถูกต้อง!

: D หวังว่าจะช่วย!


ฉันเพิ่งลองวิธีนี้ส่วนหัวสามารถมองเห็นได้จริง แต่น่าเสียดายที่การเชื่อมต่อคลาส Obj-C ยังมองไม่เห็น (หลังจากรวมไว้ในส่วนหัวของการเชื่อมต่อ)
Nikita Pronchik

11
ในตอนแรกคำตอบจะระบุว่า "Need to put the file at the same level of xcodeproj", ในตอนท้ายระบุว่า "ตรวจสอบให้แน่ใจว่าไฟล์นั้น ... ไม่อยู่ใน xcodeproj ระดับเดียวกัน" ทำไม?
บุญ

3
ฉันหมายความว่าไฟล์จะต้องอยู่ในโฟลเดอร์ย่อยของโปรเจ็กต์ไม่ใช่ในระดับเดียวกับ xcodeproj ตัวอย่าง: ในโฟลเดอร์ของโปรเจ็กต์คุณมีโปรเจ็กต์ project.xcodeproj และ projecttests ไฟล์ต้องอยู่ในโฟลเดอร์โครงการ :)
Renan Kosicki

5
ฉันลองทุกอย่างแล้ว แต่ก็ไม่ได้ผลสำหรับฉัน นี่เคืองมาก ฉันกำลังทำงานกับ xcode 8 และ swift 3 คุณช่วยฉันได้ไหม
Hardik Shah

1
ฉันสับสนที่คุณพูดว่า "นั่นหมายความว่าคุณต้องวางไฟล์ในระดับเดียวกันของ xcodeproj!" แต่หลังจากที่คุณพูดว่า "ตรวจสอบให้แน่ใจว่าไฟล์นั้นอยู่ในโฟลเดอร์หลักของโปรเจ็กต์ไม่ได้อยู่ในระดับเดียวกับ xcodeproj!" อันไหน?
Bakalolo

68

ในกรณีของฉันนี่เป็นข้อผิดพลาดที่เกิดจากการอ้างอิงแบบวงกลม ฉันมีคลาสที่นำเข้าในส่วนหัวของการเชื่อมต่อและไฟล์ส่วนหัวของคลาสนั้นกำลังนำเข้าส่วนหัวที่รวดเร็ว ( <MODULE_NAME>-Swift.h) ฉันกำลังทำสิ่งนี้เพราะในไฟล์ส่วนหัวของ Obj-C ฉันจำเป็นต้องใช้คลาสที่ประกาศใน Swift วิธีแก้ปัญหาก็คือใช้การ@classประกาศ

โดยพื้นฐานแล้วข้อผิดพลาดกล่าวว่า "Failed to import bridging header" ข้อผิดพลาดด้านบนระบุว่า<MODULE_NAME>-Swift.hไม่พบไฟล์ด้านบนนั่นคือข้อผิดพลาดที่ชี้ไปที่ไฟล์ส่วนหัว Obj-C เฉพาะ (คือ View Controller)

การตรวจสอบไฟล์นี้ฉันสังเกตเห็นว่ามี -Swift.h ประกาศอยู่ในส่วนหัว การย้ายการนำเข้านี้ไปยังการใช้งานสามารถแก้ไขปัญหาได้ ดังนั้นฉันจึงจำเป็นต้องใช้วัตถุเรียกมันว่าMyObjectกำหนดใน Swift ดังนั้นฉันจึงเปลี่ยนส่วนหัวเพื่อพูด

@class MyObject;

1
นี่เป็นเรื่องโง่ แต่การย้ายไปยังไฟล์การนำไปใช้งานก็ใช้ได้สำหรับฉันเช่นกัน น่าเสียดายที่ฉันต้องการมันในส่วนหัวเพราะชั้นเรียนของฉันใช้ผู้รับมอบสิทธิ์ที่กำหนดไว้ในไฟล์ที่รวดเร็ว แต่เนื่องจาก obj-c ไม่สนใจว่าชั้นเรียนของฉันจะใช้ผู้รับมอบสิทธิ์จริงหรือไม่เมื่อฉันผ่านไปฉันจะจัดการกับสิ่งนี้ แต่ควรมีวิธีอื่น
Oren

คุณอาจต้องตรวจสอบการนำเข้าของรายการที่คุณนำเข้าสู่ส่วนหัวเชื่อมต่อ หากคลาสที่นำเข้าเหล่านั้นมีการอ้างอิงถึงไฟล์ "-Swift.h" คุณจะต้องย้ายการประกาศไปที่. m
Kyle Carruthers

30

ค้นหาเส้นทางได้ที่:

สร้างการตั้งค่า / Swift Compiler - การสร้างโค้ด / Objective-C Bridging Header

และลบไฟล์นั้น ถ้าอย่างนั้นคุณควรจะโอเค


2
คุณชนะ. ฉันเสียเวลากับเรื่องนี้มาก ง่ายและมีประสิทธิภาพ Xcode กำลังทำอะไรบางอย่างกับเส้นทางนี้เช่นต่อท้าย $ (SRCROOT) เบื้องหลัง ฉันคิดว่าการมีช่องว่างในเส้นทางของฉันอาจเป็นส่วนหนึ่งของปัญหา แต่นี่คือกระสุนเงิน
จันทร์ที่

1
คุณจะลบไฟล์นั้นได้อย่างไร?
Jacky Wang

7
ใน Xcode 8 - แทนที่จะเป็น "Code Generation" จะอยู่ใน Swift Compiler - General
Vivek Bansal

ขอบคุณที่ช่วยฉัน ... ขอบคุณมาก
Vijay Rathod

18

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

#import <HexColors/HexColor.h>

ค่อนข้างมากกว่า

#import "HexColor.h"

2
อะไรคือความแตกต่าง?
Daniel Gomez Rico

นี่คือปัญหาสำหรับฉัน ฉันได้รับ "ไม่สามารถนำเข้าส่วนหัว Bridging" และข้อผิดพลาด "ไม่พบ XYZ.h" การเปลี่ยนแปลงนี้แก้ไขได้สำหรับฉันใน Xcode 6.4 และ Swift 1.2
Entalpi

1
@danielgomezrico คำสั่ง One ชี้ไปที่ไฟล์ในไดเร็กทอรีย่อย อีกอันชี้ไปที่ไฟล์ที่ไม่มีอยู่
Casey Murray

วิธีแก้ปัญหาสำหรับข้อผิดพลาดนี้สำหรับฉันเมื่อใช้ CocoaPods กำลังเรียกใช้การติดตั้งพ็อดอีกครั้งหลังจากสร้างการกำหนดค่าใหม่
เครื่องพิมพ์ดีด

16

สำหรับฉันการลบข้อมูลที่ได้รับการแก้ไขแล้วฉันสังเกตว่าแม้ว่าฉันจะเช็คเอาต์จากคอมมิตเก่า แต่ก็เกิดปัญหาเดียวกัน

คุณสามารถเข้าถึงตัวเลือกดังกล่าวได้จาก Window-> Projects


9

สำหรับฉันมันเป็นเพราะฉันลืมเพิ่มลงในการตั้งค่าการสร้างของเป้าหมาย

ใส่คำอธิบายภาพที่นี่


สิ่งนี้อาจช่วยได้หากคุณเพิ่มไว้ในการตั้งค่าการสร้างของโครงการเท่านั้น
zekel

9

"เราจำเป็นต้องบอกXcodeว่าจะค้นหาไฟล์ส่วนหัวที่ใดที่เราแสดงอยู่ในส่วนหัวเชื่อมต่อของเราค้นหาส่วนเส้นทางการค้นหาและเปลี่ยนการตั้งค่าระดับโปรเจ็กต์สำหรับUser Header Search Pathsโดยเพิ่มรายการแบบเรียกซ้ำสำหรับ" Pods " ไดเรกทอรี: Pods / ** " http://swiftalicio.us/2014/11/using-cocoapods-from-swift/


6

ฉันเคยประสบปัญหานี้เช่นกันและน่าเสียดายที่มันเป็นเพียงข้อบกพร่องใน SDK + Xcode ฉันได้คุยกับวิศวกรที่ WWDC เกี่ยวกับเรื่องนี้และปัญหาอื่น ๆ อีกสองสามอย่างที่ฉันพบกับ CloudKit ข้อบกพร่องเหล่านี้จะได้รับการแก้ไขในเมล็ดพันธุ์ถัดไปของ Xcode

เป็นส่วนที่น่าสนุกเกี่ยวกับการใช้ซอฟต์แวร์เบต้า


1
ใช่มันน่าหงุดหงิด ทีมของฉันและฉันกำลังพยายามหาปัญหา NSURL กับ CloudKit และเราไม่สามารถหาสาเหตุได้ว่าทำไมเราถึงได้รับข้อผิดพลาดปรากฎว่า Apple เป็นปัญหาฝั่งเซิร์ฟเวอร์ เราไม่สามารถทำอะไรได้เลย เสียเวลามาก ฮ่าฮ่า
douglas bumby

5
ปัญหาสามารถแก้ไขได้จริงโดยการวางส่วนหัวในตำแหน่งที่ถูกต้อง สิ่งที่ใช้ได้ผลสำหรับฉันคือเรียกส่วนหัว Project-Bridging-Header.h และวางไว้ในรากของแผนผังโฟลเดอร์โครงการของฉัน (เป็นพี่น้องของไฟล์โครงการ Xcode หลักของฉัน) ดูคำตอบของ @ renan-kosicki
jb

1
แก้ไขในการอัปเดต Xcode ซึ่งเกิดจากปัญหากับเบต้าในช่วงต้น
douglas bumby

3

สำหรับผู้อื่นที่มีปัญหาในการเพิ่มคลาสที่รวดเร็วลงในโครงการ Object-c นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:

  1. สร้างไฟล์ใหม่ที่รวดเร็ว สิ่งนี้จะทำให้ xcode แจ้งหากคุณต้องการให้ xcode สร้างการตั้งค่าทั้งหมดสำหรับโครงการผสม swift-objective-c รวมทั้ง brigde-header.h สำหรับคุณ กดใช่
  2. ตอนนี้เพิ่มไฟล์ที่รวดเร็วที่มีอยู่ที่คุณต้องการใช้ในโครงการของคุณ
  3. ในไฟล์การนำไปใช้งานคุณจะใช้การเพิ่มคลาสที่รวดเร็ว: #import "YOURPROJECTNAME-swift.h" xcode ไฟล์นี้สร้างให้คุณ ถ้าโปรเจ็กต์ xcode ของคุณคือ myProject แล้ว "myProject-swift.h"

และนั่นแหล่ะ ตอนนี้สร้างคลาสที่รวดเร็วในโค้ดของคุณเหมือนเป็นวัตถุประสงค์ -c


3

ฉันนำเข้าไฟล์บางไฟล์จากไฟล์ส่วนหัว bridgin จาก cocoapods ไม่ถูกต้อง

แทนการนำเข้า

#import <SomeCocoaPod/SomeCocoaPod.h>

ฉันเขียน

#import "SomeCocoaPod.h"

และนี่เป็นความผิดพลาดครั้งใหญ่ของฉัน


2

เพิ่มไฟล์ Objective-C ชั่วคราวในโปรเจ็กต์ของคุณ คุณอาจตั้งชื่ออะไรก็ได้ตามต้องการ

เลือกใช่เพื่อกำหนดค่า Objective-C bridging header

ลบไฟล์ Objective-C ชั่วคราวที่คุณเพิ่งสร้างขึ้น

ในไฟล์ projectName-Bridging-Header.h ที่เพิ่งสร้างขึ้นให้เพิ่มบรรทัดนี้:

'#import <GoogleMaps / GoogleMaps.h>'

แก้ไขไฟล์ AppDelegate.swift:

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

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

    return true
}

ไปที่ลิงค์เพื่อดูตัวอย่างฉบับเต็ม


2

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


1

หลังจากไม่กี่วันแรกของการต่อสู้ในที่สุดฉันก็สามารถรวมการสมัคร Facebook เข้ากับแอพ iOS ของฉันได้สำเร็จ นี่คือขั้นตอน (ฉันสมมติว่าคุณติดตั้ง Facebook SDK v4.1 ขึ้นไปในเครื่องของคุณแล้ว):

  1. เพิ่มกรอบงาน Facebook - FBSDKCoreKit, FBSDKLoginKit ภายใต้โครงการของคุณ
  2. ทำการเปลี่ยนแปลงในการตั้งค่า Build เนื่องจาก FB SDK v4.1 ขึ้นไปไม่จำเป็นต้องเชื่อมไฟล์ส่วนหัวอีกต่อไป
  3. นำเข้า FBSDKCorekit, FBSDKLoginKit ในไฟล์ ViewController.swift, AppDelegate.swift
  4. เพิ่มข้อมูลใน pList ตามที่ระบุไว้ที่นี่

  5. สร้างแอปของคุณ และ wohoo! ไม่มีข้อผิดพลาดเวลาคอมไพล์


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

1

ฉันมีปัญหาเดียวกันด้วยเหตุผลที่แตกต่างกันนี่คือกรณีของฉันที่ฉันสร้างโครงการที่ต้องการรวมเมนูสไลด์ฉันใช้ SWRevealViewController lib เพื่อเข้าใกล้

เมื่อฉันนำเข้าไฟล์ไลบรารีฉันเพิ่มโฟลเดอร์ย่อย (SWRevealViewController) ภายใต้ไฟล์ที่รองรับสำหรับไฟล์. h && .m มันทำให้เกิดข้อผิดพลาดสองข้อไม่สามารถนำเข้าบริดจ์และไม่พบ SWRevealViewController.h

ฉันจะแก้ไขได้อย่างไร

เมื่อฉันย้ายไฟล์ไปยังไฟล์ที่รองรับโดยตรง (ลบโฟลเดอร์ย่อย) SWRevealViewController.m จะถูกเพิ่มไปยัง Build Phases โดยอัตโนมัติ -> Compile Sources และปัญหาจะหายไป

ใส่คำอธิบายภาพที่นี่


1

ฉันพบข้อผิดพลาดดังกล่าวเมื่อฉันเพิ่มส่วนขยายวันนี้ในแอปของฉัน เป้าหมายการสร้างสำหรับส่วนขยายถูกสร้างขึ้นโดยมีชื่อเดียวกันของส่วนหัวของการเชื่อมโยงกับเป้าหมายการสร้างแอปของฉัน สิ่งนี้นำไปสู่ข้อผิดพลาดเนื่องจากส่วนขยายไม่เห็นไฟล์ที่แสดงอยู่ในส่วนหัวเชื่อมต่อของแอปของฉัน

สิ่งเดียวที่คุณต้องทำคือลบหรือเปลี่ยนชื่อของส่วนหัวเชื่อมต่อสำหรับส่วนขยายและทั้งหมดจะเรียบร้อย

หวังว่าสิ่งนี้จะช่วยได้


0

จริงๆแล้วฉันได้สร้างไฟล์ OSX Source Objective C ที่ว่างเปล่าภายใต้โครงการ (โดยที่ไฟล์ที่รวดเร็วทั้งหมดของฉันอยู่)

ฉันเพิ่มการนำเข้าแล้วลบไฟล์. m


0

ในการแก้ไขอื่น ๆ ฉันพบข้อผิดพลาดเกิดขึ้นเมื่อฉันพยายามทำ Product-> Archive ปรากฎว่าฉันมีสิ่งนี้:

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

หลังจากตั้งค่าในบรรทัดสุดท้ายแล้วก็ใช้งานได้


0

มีปัญหาที่คล้ายกันซึ่งไม่สามารถแก้ไขได้ด้วยวิธีใด ๆ ข้างต้น โครงการของฉันใช้ CocoaPods ฉันสังเกตเห็นว่าพร้อมกับข้อผิดพลาดฉันได้รับคำเตือนพร้อมข้อความต่อไปนี้:

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'

ใส่คำอธิบายภาพที่นี่

วิธีแก้ปัญหาจึงค่อนข้างง่าย สำหรับโครงการ Pods ให้เปลี่ยนแฟล็กBuild Active Architecture Onlyเป็นNoและข้อผิดพลาดเดิมก็หายไป


0

ตั้งค่าPrecompile Bridging Headerเป็นNoแก้ไขปัญหาให้ฉัน


ทำไมต้องโหวตลง? เป็นทางออกที่ถูกต้องสำหรับบางคน ฉันได้เปรียบเทียบการสร้างแบบวนซ้ำด้วยการเปิดและปิดในโปรเจ็กต์ขนาดใหญ่และไม่เห็นความแตกต่างเลย (Apple ได้รับการเร่งความเร็วสูงสุดถึง 30%) แต่ระยะเวลาที่ฉันสูญเสียการล้างไฟล์บิลด์และการสร้างตั้งแต่เริ่มต้นนั้นมีมาก
Alexandre G
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.