ios objective-c ios8

Relájese Segue no funciona en iOS 8



objective-c ios8 (10)

Tengo una aplicación, que funciona bien en iOS 7, pero cuando se creó para iOS 8, los segmentos de desconexión no funcionan.

Creé un nuevo proyecto y agregué un modal (control de navegación con tableviewcontroller) e intenté usar un modal de desenrollado. Lamentablemente tampoco funciona. Los métodos que se están desenrollando están en el controlador de vista de destino. La desconexión se crea a través del guión gráfico (un botón de la barra de navegación en el controlador de vista de tabla). Cuando toco el botón, no sucede nada. No hay salida de registro y el modal no desaparece. También parece afectar solo los valores modales. empujar / popover se desenrollan normalmente.

¿Alguien ha tenido un problema similar y tiene una idea de cómo podría resolverlo?


Apple ha corregido este error en iOS 8.1

Soluciones temporales para iOS 8.0

La desconexión segue no funcionará solo en la siguiente situación:

Ver estructura: UITabBarController -> UINagivationController -> UIViewController1 -> UIViewController2

Normalmente (en iOS 7, 8.1), cuando se desconecta de UIViewController2 a UIViewController1 , llamará a viewControllerForUnwindSegueAction en UIViewController1 .

Sin embargo, en iOS 8.0 y 8.0.x, llamará a viewControllerForUnwindSegueAction en UITabBarController en lugar de UIViewController1 , es por eso que relajarse ya no funciona.

Solución: anule viewControllerForUnwindSegueAction en UITabBarController creando un UITabBarController personalizado y use uno personalizado.

Para Swift

CustomTabBarController.swift

import UIKit class CustomTabBarController: UITabBarController { override func viewControllerForUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject?) -> UIViewController? { var resultVC = self.selectedViewController?.viewControllerForUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender) return resultVC } }

Para la vieja escuela Objetivo-C

CustomTabBarController.h

#import <UIKit/UIKit.h> @interface CustomTabBarController : UITabBarController @end

CustomTabBarController.m

#import "CustomTabBarController.h" @interface CustomTabBarController () @end @implementation CustomTabBarController -(UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender { return [self.selectedViewController viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender]; } @end

================================================== ============================

NO USE NINGUNA SOLUCIÓN POR DEBAJO DE ESTE PUNTO (están desactualizadas y solo como referencia)

Última actualización el 23 sep

Mi nueva solución es presionar hacia una vista que está integrada en un controlador de navegación, y configurar ese controlador de navegación para ocultar la barra inferior al presionar (una casilla en IB). Entonces tendrá una vista que parece una vista modal, lo único diferente es la animación de empujar y hacer estallar. Puedes personalizar si quieres

Actualizado : La solución a continuación en realidad presenta la vista modal debajo de la barra de pestañas , lo que causará más problemas de diseño de vista.

Cambie el tipo de segue a Presente, ya que Popover solo funcionará en iOS8 para iPhone , en iOS7 su aplicación se bloqueará .

Lo mismo aquí, para solucionar esto, configuré la presentación de segue al contexto actual (mi aplicación es solo para iPhone).

La pantalla predeterminada y la pantalla completa no funcionarán.


Acabo de encontrarme con este problema, y ​​después de investigar un poco descubrí que con segues modales (al menos los que tienen los modos de presentación predeterminados y de pantalla completa), no puede confiar en el mecanismo de desenrollado normal, sino que debe llamar al rechazo presentado de UIViewController ViewControllerAnimated método.


El mismo problema aqui. El método de desenrollado no se llama. Solo sucede cuando

  • usando modal segue
  • La presentación es cualquier cosa menos "contexto actual"
  • NavigationController no está extendido (usando el predeterminado del guión gráfico)

También ocurre en IOS8 GM Seed, por lo tanto, creo que necesitamos encontrar una solución. Suena como un error para mí ...

Extender UINavigationController e implementar viewControllerForUnwindSegueAction no ayudó, ya que no se activa. Lo único que se dispara es canPerformUnwindSegueAction () dentro del UINavigationController extendido. Extraño.


Encontré el mismo problema al desconectarme a un controlador de vista de origen desde un controlador de vista de destino. El destino se presentó a través de un "espectáculo" segue de la fuente. Estaba usando un simulador de iPhone que muestra iPhone 6, iOS8.3. XCode 6.3.2

La solución de subclasificar NavigationViewController funcionó para mí. Aquí está el código rápido que es esencialmente la traducción rápida de la respuesta de Raúl. Estoy desconcertado de que si Apple lo ha arreglado en iOS8.1 por Raul, ¿cómo me está golpeando en 8.3?

var sourceViewController: UIViewController? override func viewControllerForUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject?) -> UIViewController? { if(self.sourceViewController! .canPerformUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender!)){ return self.sourceViewController } return super.viewControllerForUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender) }


Este es un problema con iOS 8.0, 8.0.1 y 8.0.2. Se resolvió en 8.1; desconectar segues están llamando al método apropiado ahora.

Tenga en cuenta que en iOS 8, los controladores de vista presentados modalmente no se pueden descartar automáticamente cuando se realiza una desconexión, a diferencia de iOS 7. Para asegurarse de que siempre se descarta, puede detectar si se descarta y, si no, descartarlo manualmente. Estas inconsistencias se resuelven en iOS 9.0.

Con iOS 8.4 ejecutándose en iPhone, todos los segmentos presentados modalmente con todos los estilos de presentación se descartan al desconectarse, excepto en pantalla completa y en contexto actual. Ese también es el caso para iPad, con la adición de Hoja de formulario y Hoja de página que tampoco se descarta automáticamente. Con iOS 9, todos los estilos de presentación se descartan automáticamente tanto en iPhone como en iPad.


Parece que tanto iOS 7.1 como iOS 8.1 / 8.2 crean desenrollar segue del controlador de navegación, sin embargo, desenrollar segue está registrado en un controlador secundario dentro del controlador de navegación.

Por lo tanto, la creación manual de una secuencia de desconexión desde el controlador donde está registrado en el guión gráfico resuelve el problema.

@implementation RootNavigationController - (UIStoryboardSegue*)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier { return [toViewController segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; } @end


Pasos a seguir:

  1. Enlace el desenrollar segue al botón en Storyboard.
  2. Cree IBAction para el botón y agregue el siguiente código:

    [self dismissViewControllerAnimated:NO completion:nil];

Esto debería funcionar para todas las versiones.


Sí, a mí también me ha sucedido, creo que para su caso, debe subclasificar el UINavigationController y anular lo siguiente:

- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender { for(UIViewController *vc in self.viewControllers){ // Always use -canPerformUnwindSegueAction:fromViewController:withSender: // to determine if a view controller wants to handle an unwind action. if ([vc canPerformUnwindSegueAction:action fromViewController:fromViewController withSender:sender]) return vc; } return [super viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender]; }


Woah allí! Todavía recibo informes de usuarios de atascos en una vista modal en iOS 8.1.1 (en un iPad 3).

Estoy descartando todo esto de una vista modal. Solo un buen anticuado ...

[self dismissViewControllerAnimated:NO completion:nil];

... funciona bien en todas esas diversas versiones de iOS 8.xx.


[ ACTUALIZACIÓN : Error solucionado en iOS 8.1 beta pero lo necesitará para la compatibilidad con 8.0 y 8.0.2]

La única forma en que podía hacer que mi descanso siguiera funcionando era mezclando las respuestas de Aditya y viirus.

Mi configuración está en: [View Controller 1]> segue modal personalizado> [Navigation Controller]> root> [View Controller 2]

Relájese: [View Controller 2]> desenrollado personalizado segue> [View Controller 1]

Solución: Subclasifique el [Controlador de navegación], agregue una propiedad llamada sourceViewController y pase "self" a esa propiedad cuando se llame a prepararse para segue al pasar de [Ver controlador 1] a [Controlador de navegación]

En la subclase [Controlador de navegación] .m, anule / agregue estos dos métodos:

- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender { if ([self.sourceViewController canPerformUnwindSegueAction:action fromViewController:fromViewController withSender:sender]) { return self.sourceViewController; } return [super viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender]; }

Luego anulo esto en esa subclase [Controlador de navegación] solo porque tengo un segue de desenrollado personalizado:

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier { return [fromViewController segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; }