Подтвердить что ты не робот

Неизвестное имя типа для быстрого свойства

У меня есть класс CustomViewController, написанный в swift и класс CustomNavigationController, написанный в Objective C. Я пытаюсь добавить свой CustomNavigationController в качестве свойства для своего CustomViewController. Я добавил #import "CustomNavigationController.h" в мой заголовок.

В моем CustomViewController у меня есть:

class CustomViewController: UIViewController {

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


...


 override func viewDidLoad() {
        super.viewDidLoad()

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

Нет ошибок до тех пор, пока я не попытаюсь создать и запустить... Я получаю "неизвестное имя типа" CustomNavigationController ", вы имели в виду" UINavigationController "?"

Кто-нибудь знает, почему он не распознает тип?

4b9b3361

Ответ 1

В коде Objective-C вы импортируете автоматически созданный заголовок -Swift.h. В этом же коде перед строкой #import введите #import "CustomNavigationController.h". Порядок этих двух #import утверждений имеет решающее значение!

Это решит проблему, убедившись, что CustomNavigationController находится в пространстве имен перед автоматически созданным заголовком -Swift.h, и поэтому последний будет знать о первом, и все будет хорошо.

Это что-то неприятное, если этому классу Objective-C не нужно было знать о CustomNavigationController, но он решает проблему в будущем и позволяет продолжить работу с вашим гибридным проектом.

Ответ 2

Похоже, что сгенерированный заголовочный файл ProjectName-Swift.h не включает в себя содержимое ProjectName-Bridging-Header.h. Это приводит к тому, что любые типы, которые еще не были объявлены перед импортом ProjectName-Swift.h, вызывают ошибку Unknown type name в компиляторе. Это похоже на ошибку.

Мое обходное решение состояло в том, чтобы создать альтернативную версию ProjectName-Swift.h, которая отправляет объявления, вызывающие ошибки, а затем импортирует ProjectName-Swifth.h. Я назвал его ProjectName-Swift-Fixed.h. Для меня ProjectName-Swift-Fixed.h выглядел следующим образом:

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

Тогда всюду в коде, где я имел #include "ProjectName-Swift.h", я заменил его на #include "ProjectName-Swift-Fixed.h"

Ответ 3

В случае, если вы не можете исправить проблему, изменив порядок операторов #import, как это было предложено в приведенных выше ответах, проверка файлов в вашем ProjectName-Bridging-Header.h для отсутствия импорта инфраструктуры может работать.

В моем случае у меня был класс в заголовочном файле с мостом, который использовал UIImage в одном из его методов. Когда мой проект состоял только из Objective-C, который работал нормально, но при экспонировании этого заголовка в Swift мне пришлось добавить #import <UIKit/UIKit.h>, чтобы удалить ошибку.

Ответ 4

Попробуйте следующее:

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

Ответ 5

Я столкнулся с такой же ситуацией. В моем случае ошибки были устранены после обновления быстрой версии до 3.0 в всех целей с помощью команды "Редактировать" > "Преобразовать" > "Текущий синтаксис". Надеюсь, что это поможет.