Símbolo no encontrado:_OBJC_CLASS_$_UIPopoverController
-
25-09-2019 - |
Pregunta
Tengo problemas con mi aplicación universal.Configuré el SDK base en iPhone 3.2 y establecí el objetivo en 3.1.
Moví los archivos que usan UIPopoverController a sus propios archivos y no deberían cargarse al cargar la aplicación en el iPhone.Aún así, cuando construyo mi aplicación, aparece el siguiente error cuando construyo y depuro en mi dispositivo:
dild:Símbolo no encontrado:_OBJC_CLASS_$_UIPopoverController Referenciado desde:/var/mobile/applications/b3b90643-92dc-4e5c-8b2f-83a42d6d57e0/citybikes.app/citybikes esperado en:/System/library/frameworks/uikit.framework/uikit in /var/mobile/applications/b3b90643-92dc-4e5c-8b2f-83a42d6d57e0/citybikes.app/citybikes
Realmente espero que alguien pueda ayudarme.
Saludos cordiales, Paul Peelen
Solución
Incluso si no se cargan en tiempo de ejecución, esos archivos aún se procesan al vincularlos.El símbolo _OBJC_CLASS_$_UIPopoverController
Por lo tanto, se agrega a su aplicación como uno de los que requieren enlaces dinámicos.
Hay 2 soluciones,
- Reemplace toda la apariencia de UIPopoverController en un mensaje (p. ej.
[UIPopoverController alloc]
) conNSClassFromString(@"UIPopoverController")
, o - Haga que UIKit esté débilmente vinculado.
Otros consejos
Te recomiendo no UIKit enlace débilmente. Como KennyTM y he mencionado en nuestros comentarios, esto puede ocultar problemas futuros enlazador y provocar accidentes. Tampoco estoy diciendo simplemente cómodo con el enlazador que UIKit es opcional cuando claramente no lo es. Gran truco.
En su lugar, inicializar y llamar UIPopoverController indirectamente usando NSClassFromString:
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}
Si todavía tiene errores de enlace, puede que tenga que llamar a los mensajes de UIPopoverController usando NSSelectorFromString:
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}
Para un transporte, recomiendo escribir un objeto proxy para manejar estos detalles de implementación.