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

Символ не найден: _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

Я действительно надеюсь, что кто-то может мне помочь.

С уважением, Пол Пилен

4b9b3361

Ответ 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];
}

Для переносимости я рекомендую написать прокси-объект для обработки этих деталей реализации.