web-dev-qa-db-fra.com

Nom de type inconnu pour la propriété Swift

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?

14
Nick Yap

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.

21
matt

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"

6
johnboiles

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. 

4
Lucifer

Essaye ça:

navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as? CustomNavigationController
0
Adam

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

0
Justin Sato