La barra de herramientas de los controlleres de navigation se queda en blanco después de mostrar una UIActionSheet desde él

En una aplicación iOS que se ejecuta en iOS 6.1 (emulado) y 6.1.3 (dispositivo físico), mostramos una UIActionSheet desde una vista con el siguiente código:

UIActionSheet *actionCreateNewComment = [[UIActionSheet alloc] initWithTitle:CLocalised(@"EditExistingComment") delegate:self cancelButtonTitle:CLocalised(@"No") destructiveButtonTitle:nil otherButtonTitles: CLocalised(@"Yes"), nil]; [actionCreateNewComment setActionSheetStyle:UIActionSheetStyleBlackOpaque]; [actionCreateNewComment setTag:ActionSheetTagNewComment]; [actionCreateNewComment showFromToolbar:self.navigationController.toolbar]; [actionCreateNewComment release]; 

La vista establece la barra de herramientas con:

 UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:control]; [self setToolbarItems:[NSArray arrayWithObject:item]]; 

Donde el control es un UISegmentedControl .

El código para manejar las acciones del button son:

 -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ bool shouldAddNewComment = buttonIndex == [actionSheet cancelButtonIndex]; [self navigateToCommentScreen:shouldAddNewComment]; } 

Cada vez que se muestra esta hoja de acción, la barra de herramientas se irá "en blanco". No solo para esta vista, sino también para las otras vistas.

Aquí hay un ejemplo de un flujo de trabajo: Flujo entre Vistas

Tenga en count que si navego de Instr a Comment sin el UIActionSheet, pero de lo contrario el mismo código, el problema no aparecerá.

El problema aquí es que en la vista "Instr", la barra de herramientas está vacía. Si presento dos vistas más para regresar a "Lista", su barra de herramientas también estará vacía:

ListEmpytToolbar

Incluso si luego return a WO e Instr, al asignar e iniciar formularios nuevos y luego presionarlos, las barras de herramientas todavía estarán vacías.

Hay otra opción de navigation en la vista "Lista" que muestra una vista de "Resumen". Según los datos, esta vista se mostrará con o sin botones en la barra de herramientas: Estadísticas de la vista de resumen

Tanto "Botón de resumen" como "Resumen vacío" son vistas previstas. "Resumen oculto" se muestra después de que se haya mostrado la hoja de UIAction antes de navegar entre Inst y Comment. Pero si navego a una vista "Resumen" que se muestra como "Resumen vacío" en la image (prevista, debido a los datos), la barra de herramientas comenzará a funcionar en todas partes nuevamente. O al less hasta que vuelva a mostrar la UIActionSheet desde la vista Instr.

Hay algunos, en mi opinión, cosas extrañas sobre esto:

  • Si navego a una vista donde la barra de herramientas está vacía, que oculta la barra de herramientas, vea la image: "Vacío Resumen", luego la barra de herramientas se mostrará como se esperaba en las otras vistas.
  • Usamos el mismo código para mostrar una hoja de acción en otras vistas de la aplicación sin ningún problema
  • Si ejecuto la aplicación en un iOS 5.1 emulado o iOS 5.0 emulado, el problema no aparece

¿Me he perdido algo cuando se trata de rechazar la hoja de acción o cómo mostrarla?

Por favor, hágamelo saber si desea más información.

Actualización: si [self setToolbarItems:nil] fuerza [self setToolbarItems:nil] después del evento del button de la hoja de acción y luego lo actualizo con los mismos elementos que antes, la barra de herramientas aparecerá como está previsto. Esto no se siente como la forma correcta de hacerlo.

Actualización 2013-05-28: gracias a @LOP_Luke descubrí que si no navego a la vista "Comentario" de -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex pero acabo de devolver la barra de herramientas comenzará a funcionar de nuevo. Entonces, ¿puede haber algún tipo de problema cuando clickedButtonAtIndex a otra vista cuando luego se hace clickedButtonAtIndex todavía en la stack de llamadas?

Actualización 2013-05-29 : Si agrego un método:

 -(void)commentScreenYes{ [self vanigateToCommentScreen:YES]; } 

Y cambie el código del button para:

 -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ bool shouldAddNewComment = buttonIndex == [actionSheet cancelButtonIndex]; if(shouldAddNewComment){ [self performSelectorOnMainThread:@selector(commentScreenYes) withObject:nil waitUntilDone:NO]; return; } [self navigateToCommentScreen:shouldAddNewComment]; } 

A continuación, funcionará para el button Cancelar, pero no para el button Sí. El button cancelar también hará que la barra de herramientas vuelva a funcionar después de que se haya "roto" con el button Sí. Si canalizo los dos botones a través de este flujo (al agregar un nuevo método) ambos funcionarán. Y aún así, si lo ejecuto en iOs 5.1, funcionará independientemente del flujo que elija.

El método – setToolbarItems es un método UIViewController específico para cada controller de vista secundario de su controller de navigation. Suponiendo que [self navigateToCommentScreen:shouldAddNewComment] empuje un nuevo controller de vista a la stack de navigation, deberá configurar los elementos de la barra de herramientas para el nuevo controller de vista también como una llamada independiente, independientemente de lo que esté haciendo la hoja de acción. Por ejemplo,

 -(void) navigateToCommentScreen:(bool) shouldAddComment{ CommentViewController* viewController = [[CommentViewController alloc] init]; [self.navigationController pushViewController:viewController animated:YES]; [viewController setToolbarItems:self.toolbarItems]; } 

De lo contrario, el nuevo controller de vista no tendrá elementos de la barra de herramientas y la barra de herramientas estará en blanco.

Editar

He creado un controller de navigation con un controller de vista raíz que tiene una barra de herramientas con un control UISegmented. Empujé un nuevo controller de vista en la stack de navigation a través de un método delegado de UIActionSheet y luego lo devolví. La barra de herramientas era exactamente como debería ser en el controller de la vista raíz (el control segmentado se desvaneció como se esperaba). Debe estar haciendo algo más complicado con su controller con respecto a configurar los elementos de la barra de herramientas que los está causando que desaparezcan. Sin ver los methods de origen de su viewController, es difícil saber cuál es el problema. Asegúrese de no configurar los elementos de la barra de herramientas en cero o restablecerlos con una matriz vacía de alguna manera.