Error de compilación de depuración de aplicaciones de iPhone/iPad universal para pruebas de iPhone
ios ios-universal-app (3)
He escrito una aplicación universal para iPhone y iPad que funciona bien en el simulador de iPad en Xcode, pero ahora me gustaría probar la funcionalidad del iPhone. Parece que no puedo ejecutar el simulador de iPhone con este código, ya que siempre está predeterminado en el iPad.
En cambio, traté de ejecutar en el dispositivo y, cuando comienza a ejecutarse, aparece el siguiente error:
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
Como la aplicación se crea mediante programación en lugar de usar XIB, he dividido las 2 lógicas del dispositivo usando las siguientes líneas en el método main.m:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Pad");
}
else
{
retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Phone");
}
A partir de ese punto, utilizan diferentes AppDelegates y he comprobado mis encabezados para asegurarme de que UISplitView nunca se use ni se importe a través de la lógica del teléfono.
¿Cómo puedo evitar este error y hay una mejor manera de dividir las rutas lógicas universales en esta aplicación creada mediante programación?
Xcode 8.3, iPad 2 (no retina), código Swift 3
Lo que me ayudó fue:
- reiniciar Xcode
- hacer un ''Product -> Clean'' Shift Command K
- reconstruir el proyecto
¡Estaba teniendo un error muy similar y me estaba volviendo loco! :-) Buscando horas y no pudo resolverlo ...
Como dijiste, todo estaba bien cuando se ejecutaba en el simulador de iPad, pero cuando intentabas probar la aplicación en el iPhone con iPhone OS 3.1.2, ni siquiera comenzaba, sino que se bloqueaba con el siguiente mensaje de error:
mi_cmd_stack_list_frames no hay suficientes cuadros en la pila
Al verificar casi cada línea de código, me di cuenta de que la asignación de 3.2 clases como UIPopoverController o UISplitViewController (que ya estaba dentro del código específico del bifurcado del iPad) estaba causando el problema.
Entonces, en lugar de, es decir:
infoPopover = [[UIPopoverController alloc] initWithContentViewController: infoNavController];
Yo escribiría
infoPopover = [[NSClassFromString (@ "UIPopoverController") alloc] initWithContentViewController: infoNavController];
¡y eso resolvió mi problema! (La depuración puede ser tan difícil si el mensaje de error no le da ninguna pista sobre dónde se podría encontrar el error ...)
Ese error se desencadena porque no vinculaste débilmente el marco UIKit. El marco UIKit en iPhone OS 3.2 agregó el UISplitViewController, y si lo vincula de forma normal su aplicación supondrá que esos símbolos existen en 3.0, donde no lo hacen.
Para vincular débilmente un marco, busque su objetivo de aplicación en Xcode, inspecciónelo y vaya a la pestaña General. En la parte inferior de esa pestaña debe haber una lista de marcos, con una columna para Tipo. Cambie el Tipo de UIKit de Requerido a Débil y reconstruya su aplicación. Eso debería encargarse de los errores de tiempo de ejecución.
Su lógica condicional es sólida, pero tiendo a compartir un delegado de aplicación y hacer el diseño específico de la interfaz más adelante en la línea.
(Actualización: 21/12/2011) A partir de iOS 4.2, ya no es necesario tener marcos de enlaces débiles para evitar errores como este. Como describe Marco Arment , si compila con iOS 4.2 o posterior y se dirige al iPhone OS 3.1+, las clases individuales ahora están débilmente vinculadas y su método +class
devolver nil
si la clase no existe en la versión actual del OS.