web-dev-qa-db-de.com

Unbekannter Typname für die Swift-Eigenschaft

Ich habe eine CustomViewController-Klasse, die in Swift geschrieben wurde, und eine CustomNavigationController-Klasse, die in Objective C geschrieben wurde. Ich versuche, meinen CustomNavigationController als Eigenschaft zu meinem CustomViewController hinzuzufügen. Ich habe #import "CustomNavigationController.h" zu meinem Bridging-Header hinzugefügt. 

In meinem CustomViewController habe ich:

class CustomViewController: UIViewController {

    var navController: CustomNavigationController?
...
//init methods


...


 override func viewDidLoad() {
        super.viewDidLoad()

        //Set up Navigation Controller
        navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as CustomNavigationController!
}

Es gibt keine Fehler, bis ich versuche zu bauen und auszuführen ... Ich bekomme einen unbekannten Typnamen "CustomNavigationController"; meinten Sie "UINavigationController"?

Weiß jemand warum es den Typ nicht erkennt?

14
Nick Yap

In Ihrem Objective-C-Code importieren Sie irgendwo den automatisch generierten -Swift.h-Header. Fügen Sie in derselben Zeile vor dieser #import-Zeile #import "CustomNavigationController.h" ein. Die Reihenfolge dieser beiden #import-Anweisungen ist entscheidend!

Dadurch wird das Problem gelöst, indem sichergestellt wird, dass sich CustomNavigationController vor dem automatisch generierten -Swift.h-Header im Namespace befindet. Daher wird letzterer über den ersteren Bescheid wissen, und alles wird gut. 

Dies ist etwas ärgerlich, wenn diese Objective-C-Klasse nicht über CustomNavigationController informiert werden musste. Sie löst jedoch das Problem und kann mit Ihrem Hybridprojekt weiterarbeiten.

21
matt

Sieht aus, als würde die generierte ProjectName-Swift.h-Headerdatei den Inhalt von ProjectName-Bridging-Header.h nicht automatisch enthalten. Dies hat zur Folge, dass alle Typen, die vor dem Importieren von ProjectName-Swift.h noch nicht deklariert wurden, den Unknown type name-Fehler im Compiler auslösen. Das scheint ein Fehler zu sein.

Mein Workaround bestand darin, eine alternative Version von ProjectName-Swift.h zu erstellen, die Forward die Klassen deklariert, die die Fehler verursachen, und dann ProjectName-Swifth.h importiert. Ich habe es ProjectName-Swift-Fixed.h genannt. Für mich sah ProjectName-Swift-Fixed.h so aus:

// ProjectName-Swift-Fixed.h
@class CustomViewController;
#import "ProjectName-Swift.h"

Dann, überall im Code, wo ich #include "ProjectName-Swift.h" hatte, habe ich ihn durch #include "ProjectName-Swift-Fixed.h" ersetzt.

6
johnboiles

Falls Sie das Problem nicht beheben können, indem Sie die Reihenfolge der #import-Anweisungen gemäß den obigen Antworten ändern, kann es sinnvoll sein, die Dateien in Ihrem ProjectName-Bridging-Header.h auf fehlende Framework-Importe zu prüfen. 

In meinem Fall hatte ich eine Klasse in der Überbrückungsheaderdatei, die UIImage in einer ihrer Methoden verwendete. Als mein Projekt nur aus Objective-C bestand, funktionierte es einwandfrei, aber als ich Swift diesen Header offenlegte, musste ich #import <UIKit/UIKit.h> hinzufügen, um den Fehler zu beheben. 

4
Lucifer

Versuche dies:

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

Ich bin auf dieselbe Situation gestoßen. In meinem Fall wurden die Fehler nach der Aktualisierung der Swift-Version auf 3.0 in alle Ziele von Bearbeiten> Konvertieren> In Aktuelle Swift-Syntax behoben. Ich hoffe es hilft

0
Justin Sato