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

¿Fue útil?

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,

  1. Reemplace toda la apariencia de UIPopoverController en un mensaje (p. ej. [UIPopoverController alloc]) con NSClassFromString(@"UIPopoverController"), o
  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top