Цель C, проблема быстрой совместимости из-за циклической зависимости

Я работаю над проектом iOS, который был сделан несколько лет назад в Objective C. Поэтому я должен внедрить некоторые новые функции в существующий, так что на этот раз я использую Swift для этой цели.

Я добавил новый класс Swift:

class CampView: UIView
{
   // Code
}

Я хочу получить доступ к этому классу в одном из моих существующих классов Objective C. Итак, мне понравилось:

@class CampView;
@interface NewCampViewController : UIViewController

@property (nonatomic, strong) IBOutletCollection(CampView) NSArray *campTypes;

@end

Но когда я подключаю его к своему раскадровке, он вылетает с сообщением:

Завершение работы приложения из-за необработанного исключения "NSUnknownKeyException", причина: "[ setValue:forUndefinedKey:]: этот класс не соответствует значению ключа, соответствующему кодированию для ключа campTypes".

Также я не могу импортировать сгенерированный системой заголовочный файл Swift в этот конкретный класс, когда я делаю это, он выдает ошибку вроде:

Файл "MyApp-Swift.h" не найден

Вот почему я использовал @class CampView; в приведенном фрагменте. В ходе расследования я обнаружил, что мой NewCampViewController.h включен в заголовок моста Objective C. Подозреваю, что это связано с круговой зависимостью, но я пока не могу это исправить.

Кто-нибудь может помочь мне решить эту проблему?

1 ответ

1) Вы делаете импорт (import "MyApp-Swift.h") из файла.m вашего класса Objective-C? Это должно избежать круговой зависимости. Если вы делаете @class CampView, Xcode ожидает, что вы импортируете класс CampView в файл.m. @class - это просто приведение к вашему заголовочному файлу.

Если вы получаете файл не найден, ошибка при импорте -swift.h, попробуйте отладку, просмотрев этот пост. Кроме того, я считаю, что если вы измените имя своего проекта, имя импорта может не измениться вместе с ним. Проверьте название вашего модуля.

Если вы все еще считаете, что существует вероятность того, что проблема с этим файлом не найдена при циклическом импорте, самый простой способ убедиться в этом - добавить импорт в другой файл obj-c, который, как вы знаете, не будет циклически вызываться. и инициируйте тестовый экземпляр CampView.

2) Если проблема, как предлагает @ Paulw11, соединение в IB, вы можете проверить, установлено ли соединение, проверив проверку круглой точки рядом со свойством, связанным в коде. Нажатие на это должно показать, с чем это связано. Пустая точка не связана.Для получения дополнительной информации о том, как правильно установить соединение между IB и свойством в вашем коде, перейдите по этой ссылке.

Другие вопросы по тегам