2010-06-08 2 views
16

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

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

dyld: Символ не найден: _OBJC_CLASS _ $ _ UIPopoverController Реферировано из: /вар/мобильный/Applications/B3B90643 -92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/Ситибайки Ожидаемые в: /System/Library/Frameworks/UIKit.framework/UIKit в /вар/мобильный/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0 /citybikes.app/citybikes

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

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

ответ

27

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

Есть 2 обходные,

  1. заменить все появление UIPopoverController в сообщении (например, [UIPopoverController alloc]) с NSClassFromString(@"UIPopoverController"), или
  2. Марка UIKit слабо связаны между собой.
+0

Благодарим вас за ответ. Что вы подразумеваете под «Сделать UIKit слабосвязанным»? Первое, что кажется логикой иначе, но лучше всего было бы не менять код вообще, но я не вижу, что это происходит :( /Paul –

+0

Кроме того, как вы первый раз работаете в разделе @interface. для добавления и инициирования «UIPopoverController * popoverController;» –

+0

@Paul: это не нужно изменять. Необходимо изменить только те, что внутри '[...]'. – kennytm

4

Я настоятельно рекомендую вам не слабо ссылка 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]; 
} 

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

+1

Это лучший подход. Однако лично мне нравится использовать 'if ([UIPopoverControll class]! = Nil) {...}' вместо этого. – simonbs

 Смежные вопросы

  • Нет связанных вопросов^_^