Universal ошибка компиляции отладки iPhone/приложения для iPad для тестирования iPhone

Я записал iPhone и iPad универсальное приложение, которое хорошо работает в средстве моделирования iPad на XCode, но я теперь хотел бы протестировать функциональность iPhone. Я кажусь не могущим выполнять средство моделирования iPhone с этим кодом как он всегда значения по умолчанию к iPad?

Вместо этого я пытался работать на устройстве и поскольку оно начинает работать, я получаю следующую ошибку:

dyld: Symbol not found: _OBJC_CLASS_$_UISplitViewController
  Referenced from: /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/Test
  Expected in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/TEST

Поскольку Приложение создается программно вместо того, чтобы использовать XIB's, я разделил 2 логики устройства с помощью следующих строк в main.m методе:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Pad");
}
else
{
    retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Phone");
}

От той точки дальше они используют другой AppDelegates, и я проверил свои заголовки, чтобы гарантировать, что UISplitView никогда не используется, ни импортируется через Телефонную логику.

Как я избегаю этой ошибки и есть ли лучший способ разделить универсальные логические пути в этом программно созданном приложении?

30
задан Andrey Zverev 21 December 2011 в 18:41
поделиться

2 ответа

Эта ошибка возникает из-за того, что вы не установили слабую связь с фреймворком UIKit. Платформа UIKit в iPhone OS 3.2 добавила UISplitViewController, и если вы свяжете его в обычном режиме, ваше приложение будет предполагать, что эти символы существуют в версии 3.0, а их нет.

Чтобы установить слабую связь с фреймворком, найдите цель приложения в Xcode, проверьте ее и перейдите на вкладку «Общие». Внизу этой вкладки должен быть список фреймворков со столбцом для Типа. Измените Тип для UIKit с Обязательного на Слабый и перестройте свое приложение. Это должно позаботиться об ошибках времени выполнения.

Ваша условная логика верна, но я обычно использую делегат приложения и создаю специфичный для интерфейса макет в дальнейшем.

(Обновление: 21.12.2011) Начиная с iOS 4.2, вам больше не нужно использовать фреймворки слабых ссылок для предотвращения подобных ошибок. Как Марко Армент описывает , если вы выполняете сборку с iOS 4.2 или новее и нацеливаетесь на iPhone OS 3.1+, отдельные классы теперь слабо связаны и должны иметь возврат метода + class nil , если класс не существует в текущей версии ОС.

66
ответ дан 27 November 2019 в 23:29
поделиться

У меня была очень похожая ошибка и она сводила меня с ума! :-) Искал часами и не мог понять...

Как вы и сказали, все было в порядке при запуске в симуляторе iPad, но при попытке протестировать приложение на iPhone с iPhone OS 3.1.2 оно даже не запускалось, а падало со следующим сообщением об ошибке:

mi_cmd_stack_list_frames not enough frames in stack

Проверив почти каждую строчку кода, я понял, что причиной проблемы было выделение классов 3.2, таких как UIPopoverController или UISplitViewController (уже внутри форкнутого кода, специфичного для iPad).

Поэтому вместо, например:

infoPopover = [[UIPopoverController alloc] initWithContentViewController: infoNavController];

я написал

infoPopover = [[NSClassFromString(@"UIPopoverController") alloc] initWithContentViewController: infoNavController];

и это решило мою проблему! (Отладка может быть такой трудной, если сообщение об ошибке не дает вам никаких подсказок о том, где может быть найдена ошибка...)

.
4
ответ дан 27 November 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: