Проблема імпорту імпортного заголовка Swift


123

Виконуючи вказівки, я створив мостовий заголовок і додав до свого проекту. На жаль, сталася така помилка:

: 0: помилка: не вдалося імпортувати заголовок Objective-C '--- шлях - до --- заголовок / .... h'

Знімок екрана 1

У налаштуваннях збірки я додав рядок шляху пошуку заголовка до місця з'єднання заголовка, але нічого не допомогло.

Хтось відчував цю проблему?


Ви можете замість того, щоб додати файл заголовка самостійно. Використовуйте Новий файл .., щоб додати новий порожній файл Objective-c .m. Це дозволить xcode запропонувати вам файл з мостом заголовка, куди ви можете додати свій імпорт. Потім ви можете видалити .m файл, який ви тільки що додали
markhunte

Так, я теж звичайно пробував цей спосіб, але нічого не допомогло
Микита Прончик

Це свіжий проект чи той самий, який ви робили вручну?
markhunte

Це в новому проекті, я додав обгортку підтримки Keychain, що я одного разу писав на OBJC
Микита Прончик

Вибачте. Не впевнені, що ви маєте на увазі додану обгортку підтримки Keychain. Але я помічаю, що ви на iOS, ви отримуєте те саме з проектом OSX, яким я користувався
markhunte

Відповіді:


153

Будьте обережні, щоб додати файл у папку, на яку скаржиться ваша помилка! Я зробив ту ж помилку, якщо ви створюєте файл з Xcode, він перейде до папки: Project-> Project-> Header.h

І Xcode шукає Project-> Header.h

Це означає, що потрібно помістити файл у папку проекту (ProjectName-> ProjectNameFolder)!

Сподіваюся, що це допомагає;)

ОНОВЛЕНО: Я не впевнений, чи зрозумів я, що ви маєте на увазі, але спробуйте це вирішити вашу проблему:
1. Видаліть усі мостивні файли, які ви створили до цього часу.
2. Виберіть головну папку проекту та натисніть новий файл-> iOS-> файл заголовка.
3. Запишіть свій імпорт у створений файл заголовка.
4. Виберіть проект усередині Xcode-> Налаштування збірки, введіть у полі пошуку: мости і введіть у ключ SWIFT_OBJC_BRIDGING_HEADER ім'я файлу заголовка або шлях до нього!

Якщо ви будете виконувати ці кроки, ваш файл заголовка буде створений у правильному місці!

: D Сподіваюся, що це допомагає!


Ну, я просто спробував цей метод, заголовок дійсно видно, але, на жаль, з'єднання класів Obj-C все ще непомітні (після включення їх до мостового заголовка)
Микита Прончик

11
Спочатку у відповіді йдеться про те, що "потрібно поставити файл на однаковий рівень xcodeproj", наприкінці сказано "переконайтеся, що файл знаходиться ... не в тому ж рівні xcodeproj". Чому?
Бун

3
Я мав на увазі, що файл повинен бути розташований всередині підпапки проекту, а не на тому самому рівні, як xcodeproj. Приклад: у папці вашого проекту у вас є проект, project.xcodeproj та проектні тести. Файл повинен бути у папці проекту :)
Ренан Косицький

5
Я спробував усе, але нонігг працює на мене. Це дуже дратує. Я працюю з xcode 8 та swift 3. Чи можете ви мені допомогти
Hardik Shah

1
Я розгублений, ви говорите "Це означає, що вам потрібно розмістити файл на одному рівні xcodeproj!" але після того, як ви сказали "Переконайтесь, що файл знаходиться у головній папці проекту не на тому самому рівні xcodeproj!" який це?
bakalolo

68

У моєму випадку це насправді була помилка в результаті кругової посилання. У мене був клас, імпортований в мостовий заголовок, і цей файл заголовка класу імпортував швидкий заголовок ( <MODULE_NAME>-Swift.h). Я робив це, тому що в файлі заголовка Obj-C мені потрібно було використовувати клас, який був оголошений у Swift, рішення - просто використовувати @classдекларативне.

Отже, в основному помилка сказала "Не вдалося імпортувати мостиковий заголовок", помилка над ним вказаного <MODULE_NAME>-Swift.hфайлу не знайдена, вище - помилка, що вказує на певний файл заголовка Obj-C (а саме на контролер перегляду).

Переглядаючи цей файл, я помітив, що в заголовку було оголошено -Swift.h. Переміщення цього імпорту до реалізації вирішило проблему. Тому мені потрібно було використовувати об'єкт, давайте називати його MyObjectвизначеним у Swift, тому я просто змінив заголовок, щоб сказати

@class MyObject;

1
Це нерозумно, але переміщення його у файл реалізації працювало і для мене. На жаль, мені це було потрібно в заголовку, оскільки мій клас реалізує делегата, визначеного у швидкому файлі. Але оскільки obj-c не хвилює, чи мій клас реалізує делегат, коли я передаю його, я вирішуся з цим. Але в ідеалі був би інший спосіб
Орен

Можливо, вам також доведеться перевірити імпорт тієї, яку ви вводите, в мостовий заголовок. Якщо будь-який із цих імпортованих класів має посилання на файл "-Swift.h", вам потрібно буде перемістити декларацію до .m.
Кайл Каррутерс

30

Знайдіть шлях за адресою:

Налаштування побудови / Швидкий компілятор ration Створення коду / Об'єктивний заголовок мосту C

і видаліть цей файл. Тоді вам повинно бути гаразд.


2
Ти переміг. Я витратив на це стільки часу. Простий і ефективний. Xcode робить щось хитре з цим контуром, як-от додавання його до $ (SRCROOT) поза кадром. Я думаю, що пробіл на моєму шляху може бути частиною проблеми, але це була срібна куля.
День

1
як ви видалите цей файл?
Джекі Ван

7
У Xcode 8 - замість "Генерації коду" він знаходиться у Swift Compiler - General.
Вівек Бансал

Дякую, що ви врятуєте мене ... Велике спасибі
Vijay Rathod

18

Це, мабуть, вплине лише на невеликий відсоток людей, але в моєму випадку мій проект використовував CocoaPods, і один з цих стручків мав підрозділ із власними CocoaPods. Рішення полягало у використанні повного кута імпорту для посилання на будь-які файли у підгруппах.

#import <HexColors/HexColor.h>

Швидше ніж

#import "HexColor.h"

2
Яка різниця?
Даніель Гомес Ріко

Це було для мене проблемою. У мене виникла помилка "Імпорт імпорту мосту" та помилки "Не вдалося знайти XYZ.h". Внесення цієї зміни вирішило мене для Xcode 6.4 та Swift 1.2.
Ентальпі

1
@danielgomezrico Одне твердження вказує на файл у підкаталозі. Інші вказують на файл, який не існує.
Кейсі Мюррей

Вирішення цієї помилки для мене при використанні CocoaPods було просто запущено встановлення pod знову після створення нової конфігурації.
друкарська машинка

16

Для мене видалення виправлених даних виправлено, я помітив, навіть якщо я виходжу зі старої комісії, трапляється та сама проблема.

Ви можете скористатися цією опцією у формі Вікно-> Проекти.


9

Для мене це було тому, що я забув додати його до налаштувань збірки цілі.

введіть тут опис зображення


Це може допомогти, якщо ви лише додали його до налаштувань збірки проекту.
zekel

9

"нам потрібно сказати Xcode, де шукати файли заголовків, які ми перелічуємо в нашому мостовому заголовку . Знайдіть розділ Шляхи пошуку та змініть налаштування на рівні проекту для Шляхів пошуку в заголовку користувача , додавши рекурсивну запис для" Підсилки " каталог: 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, це було викликано проблемою з ранніми бета-версіями.
дуглас бамбі

3

для інших, хто має проблеми з додаванням швидкого класу в проект target-c. ось що для мене працює:

  1. створити НОВИЙ швидкий файл. це призведе до того, що xcode підкаже, якщо ви хочете, щоб xcode створила всі параметри для проекту swift-target-c, включаючи brigde-header.h для вас. натисніть так.
  2. тепер додайте наявні швидкі файли, які ви хочете використовувати у своєму проекті.
  3. у файлі реалізації ви будете використовувати клас swift, додайте: #import "YOURPROJECTNAME-swift.h". цей файл xcode створити для вас. якщо ваш проект xcode є myProject, тоді "myProject-swift.h"

і це все. тепер створіть у своєму коді клас swift так, як це було aim-c.


3

Я імпортував у деякі файли з файлів заголовка bridgin з cocoapods не належним чином.

Замість імпорту

#import <SomeCocoaPod/SomeCocoaPod.h>

я написав

#import "SomeCocoaPod.h"

І це була моя ВЕЛИЧНА помилка


2

Додайте до свого проекту тимчасовий файл Objective-C. Ви можете дати йому будь-яке ім’я.

Виберіть Так, щоб налаштувати заголовок мосту Objective-C.

Видаліть створений вами тимчасовий файл 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. Не вносити жодних змін у налаштування збірки, оскільки FB SDK v4.1 і вище не потребує переадресації файлів заголовків.
  3. Імпортуйте файли FBSDKCorekit, FBSDKLoginKit у файли ViewController.swift, AppDelegate.swift
  4. Додайте інформацію до списку, як згадувалося тут

  5. Створіть свій додаток. І wohoo! немає помилок компіляції в часі.


2
Ця відповідь буде краща, якби ви включили деталі із пов’язаної сторінки. Якщо пов’язана сторінка зміниться або посилання перестане працювати, люди, які читають цю відповідь, не знатимуть, що робити, коли натрапляють на крок 4.
ТНТ

1

У мене те саме питання з іншої причини, ось мій випадок, коли я будую проект, для якого потрібно включити слайд-меню, я використовую вкладку SWRevealViewController для підходу до цього

коли я імпортую бібліотечні файли, я додаю підпапку (SWRevealViewController) у розділ "Підтримуючі файли" для файлів .h && .m, він запускає дві помилки, міст імпорту нахилу, а SWRevealViewController.h не знайдено.

Як я це виправляю

коли я переміщу файли безпосередньо до Підтримуючих файлів (видаляю підпапку), SWRevealViewController.m автоматично додається до фаз збірки -> Компілювати джерела, і проблема відсутня

введіть тут опис зображення


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 на " Не вирішити проблему".


Чому голоси? Це легальне рішення для деяких людей. Я орієнтувався на те, щоб робити ітеративні побудови з цим і вимиканням у великому проекті, і зовсім не бачу різниці (Apple бачив до 30% прискорень), але кількість часу, який я втрачаю на очищення файлів збирання та збирання з нуля, є значним
Олександр Г
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.