Универсальный iPhone / iPad Application Debug Compilation Ошибка для тестирования iPhone
-
26-09-2019 - |
Вопрос
Я написал iPhone и iPad Universal App, которое отлично работает в симуляторе 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, я разбил 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, и я проверил мои заголовки, чтобы убедиться, что UISPLITVIVE никогда не используется и не импортируется по телефонной логике.
Как избежать этой ошибки и есть ли лучший способ разделить универсальные логические пути в этом программно созданном приложении?
Решение
Эта ошибка запускается, потому что вы не слабая связываете структуру Uikit. Рамки Uikit в iPhone OS 3.2 добавили UISPLITVIVECONTROLLER, и если вы ссылаетесь в его, как обычно, ваше приложение предположит, что эти символы существуют на 3.0, где они этого не сделают.
К слабым ссыланию каркас, найдите цель вашего приложения в XCode, проверьте его и перейдите на вкладку «Общие». В нижней части этой вкладки должен быть список каркасов с столбцом для типа. Измените тип для Uikit от необходимости для слабых и восстановить ваше приложение. Это должно позаботиться о ошибках времени выполнения.
Ваша условная логика - это звук, но я склонен делиться делегатом приложения и выполнить определенную интерфейсную макет вниз по линии.
(Обновление: 12.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_fraames не хватает кадров в стеке
Проверяя почти каждую линию кода, я понял, что выделение 3,2 классов, таких как UipoPoverController или UisplitviewController (уже внутри разветвленного iPad-специфического кода) вызывал проблему.
Итак вместо IE:
Infopopover = [[UipoPoverController Alloc] initWithContentViewController: Infonavcontroller];
Я бы написал
Infopopover = [[NSClassfromString (@ «UipoPoverStontroller») alloc] initwithcontentviewcontroller: Infonavcontroller];
И это решило мою проблему! (Отладка может быть настолько сложно, если сообщение об ошибке не дает вам никакой подсказки к тому, где можно найти ошибку ...)
XCode 8.3, iPad 2 (без сетчатки), Swift 3 Code
Что помогло мне было:
- Перезапустите XCode.
- сделать продукт -> чистый СдвигКомандаK.
- Восстановить проект