Вопрос

У меня проблемы с моим универсальным приложением. Я установил основу SDK на iPhone 3.2 и установить цель до 3.1.

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

Dyld: Символ не найден: _objc_class _ $ _ UipoPoverController, указанный из: /var/mobile/applations/b3b90643-92dc-42d6d57e0/citybikes.app/cityBikes ожидается в: /system/library/frameworks/uikit.framework/uikit в /var/mobile/applications/b3b90643-92dc-4e5c-8b2f-83a42d6d57e0/citybikes.app/cityBikes.

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

С наилучшими пожеланиями, Пол Пиэлен

Это было полезно?

Решение

Даже если они не загружены во время выполнения, эти файлы все еще обрабатываются в связи с ссылкой. Символ _OBJC_CLASS_$_UIPopoverController Поэтому добавляется в ваше приложение в качестве одного из тех, требующих динамического соединения.

Есть 2 обходных пути,

  1. Заменить все появление UipoPoverController в сообщении (например, [UIPopoverController alloc]) с участием NSClassFromString(@"UIPopoverController"), или
  2. Сделать Uikit слабо связанным.

Другие советы

Я настоятельно рекомендую вам нет Слабо связывать Uikit. Как сказал Кеннитм, и я упомянул в наших комментариях, это может скрыть проблемы будущего линкера и привести к авариям. Мне также просто не удобно рассказывать линкеру, что Uikit не является обязательным, когда это не так. Большой взлом.

Вместо этого инициализируйте и вызовите UiPoPovoverController, косвенно используя NSClassFromString:

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}

Если у вас все еще есть ошибки связи, вам может потребоваться позвонить в сообщения UipoPoverController, используя NSSELECTRICROMSTRING:

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
    self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top