Цель 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 и свойством в вашем коде, перейдите по этой ссылке.