Problem z importem Swift Bridging Header


123

Postępując zgodnie z instrukcjami, utworzyłem nagłówek pomostowy i dodałem do mojego projektu. Niestety wystąpił następujący błąd:

: 0: błąd: nie można zaimportować nagłówka Objective-C „--- ścieżka - do --- nagłówka / .... h”

Zrzut ekranu 1

W ustawieniach kompilacji dodałem ciąg ścieżki wyszukiwania nagłówka do lokalizacji nagłówka mostkowania, ale nic nie pomogło.

Czy ktoś doświadczył tego problemu?


Możesz zamiast samodzielnie dodawać plik nagłówkowy. Użyj opcji Nowy plik .., aby dodać nowy pusty plik Objective-c .m. Spowoduje to, że xcode zaoferuje Ci plik mostka nagłówkowego, w którym możesz dodać swoje importy. Następnie możesz usunąć właśnie dodany plik .m
markhunte,

Tak, ja też próbowałem w ten sposób, ale nic nie pomogło
Nikita Pronchik

Czy to nowy projekt, czy ten sam, który zrobiłeś ręcznie?
markhunte

Jest w nowym projekcie, dodałem otokę obsługi pęku kluczy, którą kiedyś napisałem w OBJC
Nikita Pronchik

Przepraszam. Nie jestem pewien, co masz na myśli, mówiąc o dodanej otoce obsługi pęku kluczy. Ale zauważam, że jesteś na iOS, czy dostajesz to samo z projektem OSX, z którego korzystałem
markhunte

Odpowiedzi:


153

Uważaj, aby dodać plik do folderu, na który skarży się Twój błąd! Zrobiłem ten sam błąd, jeśli utworzysz plik z Xcode, przejdzie do folderu: Project-> Project-> Header.h

Xcode szuka Project-> Header.h

Oznacza to, że musisz umieścić plik w folderze projektu (ProjectName-> ProjectNameFolder)!

Mam nadzieję, że to pomoże;)

AKTUALIZACJA: Nie jestem pewien, czy rozumiem, co masz na myśli, ale spróbuj tego, aby rozwiązać problem:
1. Usuń wszystkie pliki mostów, które utworzyłeś do tej pory.
2. Wybierz główny folder projektu i kliknij nowy plik-> iOS-> Plik nagłówkowy.
3. Zapisz import w utworzonym pliku nagłówkowym.
4. Wybierz projekt w Xcode-> Ustawienia budowania, wpisz w polu wyszukiwania: mostkowanie i wpisz w klucz SWIFT_OBJC_BRIDGING_HEADER nazwę twojego pliku nagłówkowego lub ścieżkę do niego!

Jeśli wykonasz te kroki, plik nagłówkowy zostanie utworzony we właściwej lokalizacji!

: D Mam nadzieję, że to pomaga!


Cóż, właśnie wypróbowałem tę metodę, nagłówek jest naprawdę widoczny, ale niestety mostujące klasy Obj-C są nadal niewidoczne (po uwzględnieniu ich w nagłówku mostkującym)
Nikita Pronchik

11
Na początku odpowiedź brzmi: „Trzeba umieścić plik na tym samym poziomie xcodeproj”, a na końcu „upewnij się, że plik nie jest na tym samym poziomie xcodeproj”. Czemu?
Boon

3
Chodziło mi o to, że plik musi znajdować się w podfolderze de projektu, a nie na tym samym poziomie co xcodeproj. Przykład: W folderze projektu masz project, project.xcodeproj i projecttests. Plik musi znajdować się w folderze projektu :)
Renan Kosicki

5
Próbowałem wszystkiego, ale nic nie działa dla mnie. To jest bardzo irytujące. Pracuję z xcode 8 i swift 3. Czy możesz mi pomóc
Hardik Shah

1
Jestem zdezorientowany, kiedy mówisz "To oznacza, że ​​musisz umieścić plik na tym samym poziomie xcodeproj!" ale po tym, jak powiedziałeś „Upewnij się, że plik znajduje się w głównym folderze projektu, a nie na tym samym poziomie xcodeproj!” który to?
bakalolo

68

W moim przypadku był to właściwie błąd wynikający z cyklicznego odwołania. Miałem klasę zaimportowaną w nagłówku mostkowania, a plik nagłówkowy tej klasy importował szybki nagłówek ( <MODULE_NAME>-Swift.h). Robiłem to, ponieważ w pliku nagłówkowym Obj-C musiałem użyć klasy zadeklarowanej w Swift, rozwiązaniem było po prostu użycie @classdeklaratywnej.

Zasadniczo błąd brzmiał: „Nie udało się zaimportować nagłówka mostkowania”, błąd nad nim oznacza, że <MODULE_NAME>-Swift.hnie znaleziono pliku, powyżej był to błąd wskazujący na określony plik nagłówkowy Obj-C (mianowicie kontroler widoku).

Po sprawdzeniu tego pliku zauważyłem, że w nagłówku jest zadeklarowany -Swift.h. Przeniesienie tego importu do implementacji rozwiązało problem. Musiałem więc użyć obiektu, nazwijmy go MyObjectzdefiniowanym w Swift, więc po prostu zmieniłem nagłówek, aby powiedzieć

@class MyObject;

1
To głupie, ale przeniesienie go do pliku implementacji też zadziałało. Niestety potrzebowałem tego w nagłówku, ponieważ moja klasa implementuje delegata zdefiniowanego w pliku swift. Ale ponieważ obj-c nie dba o to, czy moja klasa faktycznie implementuje delegata, kiedy ją przekazuję, rozstrzygnę to. Ale idealnie byłoby, gdyby był inny sposób
Oren

Być może będziesz musiał sprawdzić import tego, który przenosisz do nagłówka mostkowania. Jeśli którakolwiek z tych zaimportowanych klas ma odniesienie do pliku „-Swift.h”, musisz przenieść deklarację do pliku .m.
Kyle Carruthers

30

Znajdź ścieżkę pod adresem:

Ustawienia kompilacji / Swift Compiler - Generowanie kodu / Nagłówek Objective-C Bridging

i usuń ten plik. Wtedy powinno być dobrze.


2
Wygrałeś. Zmarnowałem na to tyle czasu. Proste i skuteczne. Xcode robi coś dziwnego z tą ścieżką, na przykład dołącza ją do $ (SRCROOT) za kulisami. Myślę, że wolna przestrzeń na mojej drodze może być częścią problemu, ale to była srebrna kula.
dzień

1
jak usunąć ten plik?
Jacky Wang

7
W Xcode 8 - zamiast „Code Generation” jest w Swift Compiler - General.
Vivek Bansal

Dzięki, ocaliłeś mnie ... Wielkie dzięki
Vijay Rathod

18

Prawdopodobnie wpłynie to tylko na niewielki procent ludzi, ale w moim przypadku mój projekt wykorzystywał CocoaPods, a jeden z tych strąków miał specyfikację podrzędną z własnymi CocoaPods. Rozwiązaniem było użycie importu pełnego kąta w celu odniesienia się do dowolnych plików w pod-podach.

#import <HexColors/HexColor.h>

Zamiast

#import "HexColor.h"

2
Co za różnica?
Daniel Gomez Rico

To był dla mnie problem. Otrzymałem komunikat „Nie udało się zaimportować nagłówka Bridging” i „Nie można znaleźć XYZ.h”. Wprowadzenie tej zmiany rozwiązało problem w Xcode 6.4 i Swift 1.2.
Entalpi,

1
@danielgomezrico Jedna instrukcja wskazuje na plik w podkatalogu. Drugi wskazuje na plik, który nie istnieje.
Casey Murray

Rozwiązaniem tego błędu podczas korzystania z CocoaPods było po prostu ponowne uruchomienie instalacji poda po utworzeniu nowej konfiguracji.
maszyna do pisania

16

U mnie usunięcie danych pochodnych naprawiło to, zauważyłem, że nawet jeśli wyewidencjonuję ze starego zatwierdzenia, ten sam problem się dzieje.

Możesz dotrzeć do tej opcji poprzez Okno-> Projekty.


9

Dla mnie to dlatego, że zapomniałem dodać go do ustawień kompilacji celu.

wprowadź opis obrazu tutaj


Może to pomóc, jeśli dodałeś go tylko do ustawień kompilacji projektu.
zekel

9

„Musimy powiedzieć Xcode, gdzie szukać plików nagłówkowych, które wymieniamy w naszym nagłówku pomostowym . Znajdź sekcję Search Paths i zmień ustawienia na poziomie projektu dla User Header Search Paths , dodając rekursywny wpis dla„ Pods ” katalog: Pods / ** " http://swiftalicio.us/2014/11/using-cocoapods-from-swift/


6

Doświadczyłem również tego problemu i niestety jest to tylko błąd w SDK + Xcode. Rozmawiałem z inżynierem z WWDC, o tym i kilku innych problemach, które miałem z CloudKit. Te błędy zostaną rozwiązane w następnym ziarnie Xcode.

To najfajniejsza część korzystania z oprogramowania w wersji beta.


1
Tak, to frustrujące. Mój zespół i ja pracowaliśmy nad rozwiązaniem problemu NSURL w CloudKit i nie mogliśmy dowiedzieć się, dlaczego otrzymujemy błędy, okazuje się, że był to problem po stronie serwera firmy Apple. nie mogliśmy nawet nic zrobić. zmarnowałem tyle czasu. ha ha.
Douglas Bumby

5
W rzeczywistości problem można rozwiązać, umieszczając nagłówek w prawidłowej lokalizacji. W moim przypadku zadziałało wywołanie nagłówka Project-Bridging-Header.h i umieszczenie go w katalogu głównym mojego drzewa folderów projektu (jako rodzeństwo mojego głównego pliku projektu Xcode). Zobacz odpowiedź @ renan-kosicki
jb

1
Naprawiono w aktualizacji Xcode, było to spowodowane problemem z wczesnymi wersjami beta.
Douglas Bumby

3

dla innych, którzy mają problem z dodaniem klasy szybkiej do projektu celu-c. to działa dla mnie:

  1. utwórz NOWY plik Swift. spowoduje to, że xcode zapyta, czy chcesz, aby xcode utworzył wszystkie ustawienia dla projektu mix swift-objective-c, w tym brigde-header.h. naciśnij tak.
  2. teraz dodaj istniejące pliki Swift, których chcesz użyć w projekcie.
  3. w pliku implementacji będziesz używał klasy swift dodaj: #import "NAZWA TWÓJEGO PROJEKTU-swift.h". ten plik xcode utworzy dla Ciebie. jeśli Twój projekt xcode to myProject, to „myProject-swift.h”

i to wszystko. teraz utwórz w swoim kodzie klasę swift, tak jakby była to funkcja-c.


3

Zaimportowałem niektóre pliki z plików nagłówkowych Bridgin z cocoapods w niewłaściwy sposób.

Zamiast importować

#import <SomeCocoaPod/SomeCocoaPod.h>

napisałem

#import "SomeCocoaPod.h"

I to był mój OGROMNY błąd


2

Dodaj tymczasowy plik Objective-C do swojego projektu. Możesz nadać mu dowolną nazwę.

Wybierz opcję Tak, aby skonfigurować nagłówek mostkowania Objective-C.

Usuń właśnie utworzony tymczasowy plik Objective-C.

W nowo utworzonym pliku ProjectName-Bridging-Header.h dodaj następujący wiersz:

„#import <GoogleMaps / GoogleMaps.h>”

Edytuj plik AppDelegate.swift:

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

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

    return true
}

Kliknij link, aby zobaczyć pełną próbkę


2

Dla mnie nie było to wybieranie opcji „Kopiuj elementy w razie potrzeby” w ścieżce docelowej podczas dodawania frameworka. Po prostu ponownie dodaj strukturę z wybraną tą opcją.


1

Po pierwszych kilku dniach zmagań w końcu udało mi się z powodzeniem zintegrować rejestrację na Facebooku z moją aplikacją na iOS. Oto kroki (zakładam, że zainstalowałeś już Facebook SDK v4.1 lub nowszy na swoich komputerach):

  1. Dodaj frameworki Facebooka - FBSDKCoreKit, FBSDKLoginKit do swojego projektu.
  2. Nie wprowadzaj żadnych zmian w ustawieniach kompilacji, ponieważ FB SDK w wersji 4.1 i nowszych nie wymaga już mostkowania plików nagłówkowych.
  3. Importuj FBSDKCorekit, FBSDKLoginKit w plikach ViewController.swift, AppDelegate.swift
  4. Dodaj informacje do pList, jak wspomniano tutaj

  5. Zbuduj swoją aplikację. I wohoo! brak błędów czasu kompilacji.


2
Ta odpowiedź byłaby lepsza, gdybyś dołączył szczegóły z połączonej strony. Jeśli strona, do której prowadzi łącze, zmieni się lub link przestanie działać, osoby czytające tę odpowiedź nie będą wiedzieć, co zrobić, gdy natrafią na krok 4.
TNT

1

Mam ten sam problem z innego powodu, oto mój przypadek , w którym buduję projekt, który wymaga dołączenia menu slajdów, używam SWRevealViewController lib, aby do tego podejść

kiedy importuję pliki biblioteki, dodaję podfolder (SWRevealViewController) w obszarze Supporting Files for .h && .m files, uruchamia dwa błędy, nie można importować mostu i SWRevealViewController.h nie został znaleziony.

Jak to naprawić

kiedy przenoszę pliki bezpośrednio do Supporting Files (usuwam podfolder), SWRevealViewController.m jest automatycznie dodawany do Build Phases -> Compile Sources i problem zniknął

wprowadź opis obrazu tutaj


1

Wystąpił taki błąd, kiedy dodawałem rozszerzenie Today do mojej aplikacji. Cel kompilacji dla rozszerzenia został wygenerowany z taką samą nazwą nagłówka mostkowania jak cel kompilacji mojej aplikacji. Doprowadziło to do błędu, ponieważ rozszerzenie nie widzi plików wymienionych w nagłówku mostkowania mojej aplikacji.

Jedyne, co musisz zrobić, to usunąć lub zmienić nazwę nagłówka mostkowania dla rozszerzenia i wszystko będzie dobrze.

Mam nadzieję, że to pomoże.


0

Właściwie utworzyłem pusty plik OSX Source Objective C w ramach projektu (gdzie znajdują się wszystkie moje pliki Swift).

Dodałem import, a następnie usunąłem plik .m .


0

Wśród innych poprawek pojawił się błąd, gdy próbowałem zrobić Produkt-> Archiwum. Okazuje się, że miałem to:

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

Po ustawieniu go w ostatniej linii zadziałało.


0

Miał podobny problem, którego nie można rozwiązać żadnym rozwiązaniem powyżej. Mój projekt korzysta z CocoaPods. Zauważyłem, że wraz z błędami dostałem ostrzeżenie z następującym komunikatem:

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'

wprowadź opis obrazu tutaj

Rozwiązanie było więc dość proste. W przypadku projektu Pods zmień flagę Build Active Architecture Only na No i oryginalny błąd zniknął.


0

Ustaw Precompile Bridging Header na No, aby rozwiązać problem.


Dlaczego głosy przeciw? Dla niektórych to uzasadnione rozwiązanie. Przeprowadziłem testy porównawcze, wykonując iteracyjne kompilacje z włączaniem i wyłączaniem w dużym projekcie i nie widzę żadnej różnicy (Apple odnotował przyspieszenia do 30%), ale ilość czasu, którą tracę na czyszczenie plików kompilacji i budowanie od zera, jest znaczna
Alexandre G
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.