Xcode MyProjectName-Bridging-Header.h não existe

118

Eu quero começar a usar o Swift em meu projeto Objective-C. Então, eu adicionei uma classe rápida:

import Foundation
@objc class System : NSObject {
    @objc func printSome() {
        println("Print line System");
    }
}

E importou para um arquivo .m:

#import "MyProjectName-Swift.h"

Ao construir meu projeto, recebo o seguinte erro:

Bridging header 'PathToMyProject/MyProjectName-Bridging-Header.h' does not exist

NOTA: Em "Build Settings-> Swift Compiler - Code Generation-> Objective-C Briding Header" é definido como MyProjectName-Bridging-Header.h

O que devo fazer para resolver esse problema?

Qualquer ajuda é muito apreciada.

EDITAR: Arquivo Bridging-Header: #if defined (__ has_include) && __has_include () # include #endif

#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

#if defined(__has_include) && __has_include(<uchar.h>)
# include <uchar.h>
#elif __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
#endif
#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif

#if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted) 
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif

#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif

#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif

#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
#  define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"

#if defined(__has_feature) && __has_feature(modules)
#endif

#pragma clang diagnostic pop
user2408952
fonte
2
MyProjectName-Swift.he MyProjectName-Bridging-Header.htrabalhar em direções opostas. MyProjectName-Swift.hé fornecido automaticamente. MyProjectName-Bridging-Header.h, no entanto, é fornecido de forma semi-automática, ou seja, você precisa ter certeza de que está lá. Então, você tem certeza que pode ver MyProjectName-Bridging-Header.hno navegador do seu projeto? Caso contrário, crie e adicione um arquivo com esse nome ao seu projeto. Em seguida, verifique novamente se o caminho para ele nas configurações de compilação está correta (que deve incluir o diretório do projeto: MyProjectName/MyProjectName-Bridging-Header.h.
Milos
Você verificou se o nome do módulo do produto não está vazio? (Configurações de compilação -> Embalagem -> Nome do módulo do produto)
Nina
Nina, sim, meu nome de módulo é "MyProjectName" e não algo ells
user2408952
milos, pensei que o Xcode deveria gerar automaticamente este arquivo de ligação. Então, não, não tenho esse arquivo no meu projeto.
user2408952
1
Você especificou manualmente o Bridging-Header.h? Entendo, há um erro de grafia 'Briding'
Nina

Respostas:

191

Se o arquivo de ponte for criado no mesmo nível que as outras classes, pode ser necessário adicionar o caminho relativo, como mostram essas imagens. Observe aqui que o arquivo de ponte é criado no mesmo nível que as outras classes: insira a descrição da imagem aqui

Eu tenho o nome inserido corretamente nas configurações de compilação, insira a descrição da imagem aqui

mas o compilador não encontra o arquivo. insira a descrição da imagem aqui

Portanto, se eu adicionar o caminho relativo da raiz do projeto (ou seja, eu adiciono ./ProjectName/BridgerFileName.h), insira a descrição da imagem aqui

agora ele compila e posso chamar um método em minha classe Objective C: insira a descrição da imagem aqui

James Toomey
fonte
4
Para mim, não corrige de forma alguma. Parece que o XCode não reage ao campo Objective-C Bridging Header atualizado.
Darius Miliauskas
Demorou muito para eu encontrar, mas finalmente. Obrigado, corrigiu o erro :)
Anders Sørensen
Bem demonstrado! E sim, não se esqueça de fazer isso nas configurações de compilação do projeto e também nas configurações de compilação de destino.
Akash Bhardwaj
72

Descobri que, depois de criar o arquivo de cabeçalho de ponte manualmente e escolher o nome e local padrão, o cabeçalho de ponte será colocado no diretório do projeto, que está sob o diretório raiz.

Isso requer o seguinte valor para a configuração: Targets> [Your App Target]> Build Settings> Swift Compiler - Code Generation> Objective-C Bridging Header :

$(SRCROOT)/$(PROJECT_NAME)/$(PROJECT_NAME)-Bridging-Header.h 

Observe que, se o seu projeto for um módulo (framework) swift, então, conforme apontado nos comentários, você pode preferir:

$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h
Don Vaughn
fonte
2
$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.hserá mais comum :)
gaussblurinc
1
esta deve ser a única resposta!
Luca Davanzo
$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.haté minha pasta de projeto estou obtendo o caminho correto, mas anexando /$(PROJECT_NAME)não me levando ao caminho desejado.
iPeter
Nota para outras pessoas que podem ter o mesmo problema - Quando eu copiei / colei o comentário @gaussblurinc, algum caractere estranho foi copiado na parte 'Cabeçalho' da string. Depois de copiar / colar a mesma string da resposta, funcionou bem.
Adam Johns
46

Para aqueles que estão removendo o cabeçalho de ponte

Eu estava indo na direção oposta da maioria das outras respostas aqui. Eu estava usando um Bridging Header anteriormente, mas não precisava mais dele. Depois de excluí-lo do meu projeto, comecei a receber o erro mencionado na pergunta. Executei os seguintes passos para resolver meu problema.

  1. Acesse Targets> [Your App Target]> Build Settings> Swift Compiler - General> Objective-C Bridging Header e exclua o caminho. (Obrigado a @Donamite pela ideia.) (Você pode simplesmente começar a digitar "ponte" na caixa de pesquisa para encontrá-lo.)
  2. Exclua a data derivada. Vá para Xcode> Preferências> Locais e clique na seta cinza ao lado da pasta Dados Derivados. Em seguida, exclua a pasta do projeto.

insira a descrição da imagem aqui

Suragch
fonte
22

Em Swift 4.1

seu projeto você não tem bridging-Header.harquivo, mas seu projeto tem esse caminho. Para isso, você precisa excluir esse caminho ...

Vá para o targetsarquivo e selecione Build Settings, ----> Swift Compiler - Generale exclua o bridging-Header.h. Siga as capturas de tela abaixo ....insira a descrição da imagem aqui

Exclua o bridging-Header.harquivo no Compilador Swift - Geral

insira a descrição da imagem aqui

Agora você ficou assim ...

insira a descrição da imagem aqui

iOS
fonte
14

Para adicionar o arquivo Bridge no projeto Swift.

Etapa 1. Vá para Arquivo> Adicionar Cocoa com o arquivo Objective-C (para fins temporários)

insira a descrição da imagem aqui

Etapa 2. Em seguida, o seguinte pop-up apareceráinsira a descrição da imagem aqui

Agora pressione o botão Criar cabeçalho de ponte

FEITO,
VOCÊ OBTERÁ ARQUIVO BRIGDE EM BUNDLE
AGRADECIMENTOS

Maninderjit Singh
fonte
13

Estas são as etapas para criar o cabeçalho Bridging.

  1. Arquivo-> Novo-> iOS-> Arquivo de cabeçalho , dê o nome do arquivo de ponte como "yourProjectName-Bridging-Header.h"

  2. Build-Settings-> Objective-C Bridging Header , basta dar ao arquivo de cabeçalho de ponte o nome de "ProjectName-Bridging-Header.h"

    NOTA: O arquivo de cabeçalho de ponte deve estar localizado na pasta raiz principal do projeto onde o arquivo ".xcodeproj" está localizado. Caso contrário, mova o arquivo de cabeçalho Bridging para a pasta raiz do projeto. Desta forma o Xcode consegue acessar o arquivo de bridge.

  3. Compile o projeto e importe os arquivos necessários no cabeçalho Bridging.

Vishnuvardhan
fonte
12

Para mim, ajudou a usar $ (SRCROOT) / $ (PROJECT_NAME) / na frente do meu caminho de arquivo de cabeçalho de ponte

Srinivas Padidala
fonte
1
Esta é uma resposta válida. Não deveria ter sido marcado. Você pode usar $ (SRCROOT) e $ (PROJECT_NAME) como um guia para chegar à resposta certa, mas provavelmente não conseguirá copiar e colar todas as soluções.
Hobbes the Tige,
A solução apresentada nesta resposta realmente corrigiu meu problema, obrigado Srinivas Padidala
Wilson
Vá em frente. $ (SRCROOT) / $ (PROJECT_NAME) /YourProjectName-Bridging-Header.h funciona para mim ............ Cole $ (SRCROOT) / $ (PROJECT_NAME) / como está ..... não adicione o nome do seu projeto no lugar de $ (PROJECT_NAME)
ioSana
6

Para mim ajudou a usar $(SRCROOT)na frente do meu caminho de cabeçalho de ponte Objective-C.

$(SRCROOT)/swiftLibraries/swiftLibraries-Bridging-Header.h
Antoine
fonte
5

Siga os passos abaixo:

  1. Exclua o arquivo de cabeçalho de ponte. . . (Talvez você crie manualmente) e;
  2. Crie um novo arquivo Swift no Projeto Objective-C. . . (Não importe, primeiro crie-o)

Talvez essas duas coisas ajudem a resolver seu problema.

iHart
fonte
5

O seguinte funcionou para mim:

  1. O arquivo de cabeçalho de ponte deve estar localizado na pasta raiz principal do projeto onde o arquivo ".xcodeproj" está localizado. Mova para o diretório do projeto e arraste e solte o cabeçalho da ponte para a raiz se estiver dentro de qualquer outra pasta.
  2. Corrija erros de grafia no nome do cabeçalho.
  3. Limpar dados derivados
  4. Destino -> Configurações de construção -> Compilador Swift: Geral -> Adicionar nome de cabeçalho Obj C.
  5. Limpe e execute novamente.
AG
fonte
2

Criando arquivo de cabeçalho de ponte manualmente

Antes de mais nada, exclua o arquivo de cabeçalho Bridging que o Xcode foi criado. E selecione seu projeto, vá para> Build Settings> Search the keyword. Compilador Swift - Geração de código. Clique em Objective-C Bridging Header e exclua esse caminho. Agora limpe seu projeto.

Agora selecione seu projeto> Janela na barra de navegação. Selecione Projetos e exclua seus dados derivados de lá.

Agora crie um novo arquivo, selecione a fonte e, em seguida, selecione o arquivo de cabeçalho e crie seu arquivo de cabeçalho de Bridging. O nome do arquivo deve ser seu projectname-Bridging-Header.h e então criá-lo

Selecione seu projeto, vá para> Build Settings> Search the keyword. Compilador Swift - Geração de código. Clique em Objective-C Bridging Header e agora adicione o caminho neste Objective-C Bridging Header como projectname-Bridging-Header.h

Agora importe suas classes para o arquivo de cabeçalho de ponte e você pode compilá-lo em seu código facilmente.

Seu arquivo de cabeçalho de ponte fica assim quando você está criando seu arquivo manualmente.

Mandeep Singh
fonte
0

O que me ajudou foi mover o arquivo manualmente para o caminho mencionado em uma mensagem de erro. Assim:

  1. Excluí o arquivo (movido para a lixeira)
  2. Moveu-o da lixeira para o caminho em uma mensagem de erro
  3. Mais tarde também tive que limpar o projeto
jreft56
fonte