Символ не найден: _OBJC_CLASS _ $_ UIPopoverController
У меня проблемы с моим универсальным приложением.
Я установил базовый SDK на iPhone 3.2 и установил цель в 3.1.
Я переместил файлы, которые используют UIPopoverController, в свои собственные файлы, и они не должны загружаться при загрузке приложения на iPhone.
Тем не менее, когда я создаю свое приложение, я получаю следующую ошибку при создании и отладке своего устройства:
dyld: Символ не найден: _OBJC_CLASS _ $_ UIPopoverController Ссылка на: /var/mobile/Applications/B 3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes Ожидается в: /System/Library/Frameworks/UIKit.framework/UIKit в /var/mobile/Applications/B 3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes
Я действительно надеюсь, что кто-то может мне помочь.
С уважением,
Пол Пилен
Ответы
Ответ 1
Даже если они не загружены во время выполнения, эти файлы все еще обрабатываются при связывании. Поэтому символ _OBJC_CLASS_$_UIPopoverController
добавляется в ваше приложение как один из тех, которые требуют динамической компоновки.
Существует 2 способа обхода,
- Заменить весь внешний вид UIPopoverController в сообщении (например,
[UIPopoverController alloc]
) с помощью NSClassFromString(@"UIPopoverController")
или
- Сделать UIKit слабосвязанным.
Ответ 2
Я настоятельно рекомендую вам не слабо связывать UIKit. Как мы упоминали KennyTM в наших комментариях, это может скрыть будущие проблемы компоновщика и привести к сбоям. Мне также просто не нравится говорить компоновщику, что UIKit является необязательным, когда это явно не так. Большой взлом.
Вместо этого инициализируйте и вызовите UIPopoverController косвенно, используя NSClassFromString:
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}
Если у вас все еще есть ошибки компоновщика, вам может потребоваться вызывать сообщения UIPopoverController с помощью NSSelectorFromString:
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}
Для переносимости я рекомендую написать прокси-объект для обработки этих деталей реализации.