J'ai une classe CustomViewController écrite dans Swift et une classe CustomNavigationController écrite dans Objective C. J'essaie d'ajouter mon CustomNavigationController en tant que propriété à mon CustomViewController. J'ai ajouté #import "CustomNavigationController.h"
à mon en-tête de pontage.
Dans mon CustomViewController, j'ai:
class CustomViewController: UIViewController {
var navController: CustomNavigationController?
...
//init methods
...
override func viewDidLoad() {
super.viewDidLoad()
//Set up Navigation Controller
navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as CustomNavigationController!
}
Il n'y a pas d'erreur jusqu'à ce que j'essaye de construire et d'exécuter ... Je reçois "nom de type inconnu 'CustomNavigationController'; voulez-vous dire 'UINavigationController'?"
Est-ce que quelqu'un sait pourquoi il ne reconnaît pas le type?
Dans votre code Objective-C, vous importez quelque part l'en-tête -Swift.h
généré automatiquement. Dans le même code, avant cette ligne #import
, insérez #import "CustomNavigationController.h"
. L'ordre de ces deux instructions #import
est crucial!
Cela résoudra le problème en vérifiant que CustomNavigationController se trouve dans l’espace de noms avant l’en-tête -Swift.h
généré automatiquement. Ainsi, ce dernier sera au courant du précédent et tout ira bien.
C'est quelque peu gênant si cette classe Objective-C n'a pas besoin de connaître CustomNavigationController, mais cela résout le problème et permet de continuer à travailler avec votre projet hybride.
On dirait que le fichier d'en-tête généré par ProjectName-Swift.h
n'inclut pas automatiquement le contenu de ProjectName-Bridging-Header.h
. Ainsi, tous les types qui n'ont pas encore été déclarés avant l'importation ProjectName-Swift.h
génèrent l'erreur Unknown type name
dans le compilateur. Cela ressemble à un bug.
Ma solution de contournement consistait à créer une version alternative de ProjectName-Swift.h
qui transfère en avant les classes à l'origine des erreurs, puis importe ProjectName-Swifth.h
. Je l'ai appelé ProjectName-Swift-Fixed.h
. Pour moi, ProjectName-Swift-Fixed.h
ressemblait à ceci:
// ProjectName-Swift-Fixed.h
@class CustomViewController;
#import "ProjectName-Swift.h"
Ensuite, partout dans le code où j'avais #include "ProjectName-Swift.h"
, je l'ai remplacé par #include "ProjectName-Swift-Fixed.h"
Si vous ne pouvez pas résoudre le problème en modifiant l’ordre des instructions #import
comme suggéré par les réponses ci-dessus, il peut être utile de rechercher dans les fichiers de votre ProjectName-Bridging-Header.h
les importations d’infrastructure manquantes.
Dans mon cas, j'avais une classe dans le fichier d'en-tête de pontage qui utilisait UIImage
dans l'une de ses méthodes. Lorsque mon projet consistait uniquement en Objective-C, il fonctionnait correctement, mais pour exposer cet en-tête à Swift, je devais ajouter #import <UIKit/UIKit.h>
afin de supprimer l'erreur.
Essaye ça:
navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as? CustomNavigationController
J'ai rencontré la même situation. Dans mon cas, les erreurs résolues après la mise à jour de la version Swift vers la version 3.0 dans toutes les cibles par Édition> Convertir> Vers la syntaxe actuelle de Swift. J'espère que ça aide