Pregunta

Seguro que se ve lo suficientemente inocuo. En mi Delegado de aplicaciones, verifico NSUserDefaults para ver un indicador que muestre sugerencias al inicio. Si está configurado, al final de applicationDidFinishLaunching: , hago esto:

TipsViewController *vc = [[TipsViewController alloc]
  initWithNibName:@“TipsView" bundle:nil];
[window addSubview:vc.view];
[vc release];

La idea es mostrar esta vista temporalmente. (Tenga en cuenta que no es un VC modal. Sin controlador de navegación en este momento, además no hay barra de navegación en esta vista de todos modos.)

Una vez que se descarta esta vista, agregaremos nuestra vista preferente UITabBarController a la ventana y la transición a ella, luego eliminaremos la vista de la punta de la ventana principal ventana. Todavía no he llegado al punto de vista de rechazo porque, bueno, sigue leyendo.

El VC de My TipsView & # 8217; s está conectado más o menos así:

UIView -> view -> File’s Owner (TipsViewController)
  UIImageView -> background image
  UIView -> tipView -> File’s Owner
    UIImageView -> background image
    UIScrollView
      UILabel (tip text)
    UIButton -> touch-up-inside -> -(IBAction)button1:
    UIButton -> touch-up-inside -> -(IBAction)button2:
    UIButton -> touch-up-inside -> -(IBAction)button3:

La fuente contiene declaraciones y definiciones para las tres llamadas IBAction . En este momento dos de ellos no hacen nada. El tercero cambia la sugerencia text , cambia el tamaño para que se ajuste y ajusta la vista de desplazamiento & # 8217; s contentSize para que coincida.

Cuando ejecuto la aplicación, la vista TipsViewController se muestra muy bien. Incluso puedo desplazarme por el texto de la sugerencia. Sin embargo, cuando disparo un retoque interior en cualquier UIButton , Xcode comienza a plantarme en la fuente (donde he & # 8217; he colocado un punto de interrupción en cada IBAction ) & # 8230; y luego se rescata con un EXC_BAD_ACCESS o obj_stack_overflow .

He comparado esto con otras partes de la aplicación donde tengo un VC, una vista y botones. Es idéntico en todos los sentidos, excepto que, en este caso, he agregado una vista de VC como una subvista de la ventana de la aplicación en lugar de insertar el VC en un controlador de navegación . Además, la Guía de programación del controlador de vista para iPhone OS dice que este es un juego justo:

  

Si usa un solo controlador de vista en   su aplicación, agrega su vista a   una ventana en lugar de agregar la vista   controlador a una barra de pestañas o navegación   controlador.

Verdadero, do tengo un UITabBarController esperando en las alas, y tiene pestañas con UINavigationControllers (y otros VC) en él. Sin embargo, si se muestra la vista de punta, la vista del controlador de la barra de pestañas no todavía se ha agregado a la ventana. La intención es cambiarlo después de que hayamos terminado de mostrar consejos. En otras palabras, para todos los efectos, estamos actuando temporalmente como si tuviéramos un solo VC en juego. Luego, cambiamos a la barra de pestañas y derribamos el VC de la punta.

¿Quizás estoy haciendo algo sutilmente malo? ¿Hay una mejor manera? (& # 8220; ¡Tiene que haber una mejor manera! & # 8221;)

Ejemplo de seguimiento de pila:

#0  0x992b6f52 in objc_exception_throw
#1  0x302d6ffb in -[NSObject doesNotRecognizeSelector:]
#2  0x3026e056 in ___forwarding___
#3  0x3024a0a2 in __forwarding_prep_0___
#4  0x308f79d1 in -[UIApplication sendAction:to:from:forEvent:]
#5  0x309598b1 in -[UIControl sendAction:to:forEvent:]
#6  0x3095bad2 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
#7  0x3095a81e in -[UIControl touchesEnded:withEvent:]
#8  0x30910fdf in -[UIWindow _sendTouchesForEvent:]
#9  0x308faecb in -[UIApplication sendEvent:]
#10 0x309013e1 in _UIApplicationHandleEvent
#11 0x32046375 in PurpleEventCallback
#12 0x30245560 in CFRunLoopRunSpecific
#13 0x30244628 in CFRunLoopRunInMode
#14 0x32044c31 in GSEventRunModal
#15 0x32044cf6 in GSEventRun
#16 0x309021ee in UIApplicationMain
#17 0x00002888 in main at main.m:14

Como puede ver en el rastreo, terminamos en doesNotRecognizeSelector: & # 8230; excepto que puedo ver claramente los métodos en mi fuente VC tip. Además, todos están conectados. (No hay cables múltiples ni nada de eso en IB. Todo se ve bien allí, hasta las relaciones de Propietario del Archivo).

¡Pistas bienvenidas / apreciadas!

¿Fue útil?

Solución

El problema está ahí en su primer fragmento de código: está creando una instancia de TipsViewController, conservando su vista y luego liberando el controlador de vista, lo que hará que se desasigne. Así que ahora el target de los botones es un puntero al controlador de vista desasignado.

Una vista no retiene su controlador de vista, ni retiene sus delegados u objetivos.

Deberá mantener la instancia del controlador de vista retenida, tal vez en una propiedad retener , durante el tiempo que desee que se muestre la vista. Cuando haya terminado con la vista, puede eliminarla de su vista principal y liberar el controlador de vista.

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