Я записал 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 никогда не используется, ни импортируется через Телефонную логику.
Как я избегаю этой ошибки и есть ли лучший способ разделить универсальные логические пути в этом программно созданном приложении?
Эта ошибка возникает из-за того, что вы не установили слабую связь с фреймворком 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
, если класс не существует в текущей версии ОС.
У меня была очень похожая ошибка и она сводила меня с ума! :-) Искал часами и не мог понять...
Как вы и сказали, все было в порядке при запуске в симуляторе 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];
и это решило мою проблему! (Отладка может быть такой трудной, если сообщение об ошибке не дает вам никаких подсказок о том, где может быть найдена ошибка...)
.