66 votes

Unwind Segue ne fonctionne pas sous iOS 8

J'ai une application, qui fonctionne très bien sous iOS 7, mais lorsqu'il construit pour iOS 8 le déroulement enchaîne sont pas de travail.

J'ai créé un nouveau projet et ajouter un modal (navigationcontroller avec tableviewcontroller)et essayé d'utiliser un dérouleur modal. Malheureusement, il ne fonctionne pas non plus. Les méthodes qui sont en train de se détendre, sont dans la desination-vue-contrôleur. Le déroulement des enchaînements est créé par le biais de la table de montage séquentiel (un Navigationbar bouton dans le tableviewcontroller) Quand j'appuie sur le bouton, rien ne se passe. Il n'y a pas de log de sortie et le modal ne disparaît pas. De plus, cela ne semble affecter modal enchaîne. push/liste sont déroulés normalement.

Quelqu'un a eu un problème similaire et a une Idée de comment je pourrais le résoudre?

60voto

Stewart Hou Points 153

Apple a CORRIGÉ ce bug dans iOS 8.1

Des solutions temporaires pour iOS 8.0

Le déroulement des enchaînements ne fonctionnera pas seulement dans la situation suivante dans laquelle:

Vue de la structure: UITabBarController -> UINagivationController -> UIViewController1 -> UIViewController2

Normalement (dans iOS 7, 8.1), Lorsque vous détendre de UIViewController2 à UIViewController1, il va appeler viewControllerForUnwindSegueAction dans UIViewController1.

Toutefois, dans iOS 8.0 8.0.x, il va appeler viewControllerForUnwindSegueAction dans UITabBarController au lieu de UIViewController1, c'est pourquoi vous détendre segue ne fonctionne plus.

Solution: remplacer viewControllerForUnwindSegueAction dans UITabBarController en créer un personnalisé UITabBarController et personnalisée.

Pour 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
    }

}

Pour les anciens de l'école Objective-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

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

NE PAS UTILISER de SOLUTIONS au-DESSOUS de CE POINT, ils sont obsolètes et seulement pour la référence)

Dernière mise à jour le 23 septembre

Ma nouvelle solution est de pousser à une vision embarqué dans une manette de navigation, et la config manette de navigation pour masquer la barre inférieure sur push(une case à cocher dans l'IB). Ensuite, vous aurez une vue ressemble à un modal de vue, la seule différence est la animer de pousser et de les faire éclater. Vous pouvez personnaliser si vous le souhaitez

Mise à jour: La solution ci-dessous la modale de la vue sous la barre des onglets, ce qui causera plus de vue problèmes de mise en page.

Modifier la séquence de type à Présent Comme Liste ne fonctionne que sur iOS8 pour les iPhones, sur iOS7 votre application crash.

Même ici, pour résoudre ce problème, j'ai mis segue présentation contexte actuel(mon app pour iphone uniquement).

Par défaut et le plein écran ne fonctionne pas.

enter image description here

9voto

Raul Rea Points 61

[Mise à JOUR: correction d'un Bug sur iOS 8.1 bêta, mais vous en aurez besoin pour la 8.0 et 8.0.2]

La seule façon que j'ai pu faire mon détendez-vous des enchaînements de travail était en mélangeant Aditya et viirus réponses.

Ma configuration, allez dans: [View Controller 1] > personnalisé modal segue > [manette de Navigation] > root > [View Controller 2]

Détendez-vous: [View Controller 2] > personnalisé vous détendre segue > [View Controller 1]

Correctif: Sous-classe [Navigation Controller], ajouter une propriété appelée sourceViewController et de passer de "auto" à la propriété lors de la préparer pour la transition est appelée lorsqu'on passe de [View Controller 1] à [Navigation Controller]

Dans le bouton [Navigation Controller] sous-classe .m remplacer/ajouter ces deux méthodes:

- (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];   
}

Puis-je remplacer ce qu' [Navigation Controller] sous-classe seulement parce que j'ai une coutume de se détendre segue:

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

6voto

Joey Points 2141

C'est un problème avec iOS 8.0 (et iOS 8.0.1 et 8.0.2). Toutefois, avec iOS 8.1 bêta (12B401), ce problème semble être entièrement résolu. Unwind segues appelle la méthode appropriée maintenant.

Notez que sur iOS 8, les contrôleurs de vue présentés de manière modale ne sont pas automatiquement exclus lors de la séquence de déroulement, contrairement à iOS 7. Si vous devez prendre en charge iOS 7 et 8, vous pouvez détecter s'il est ignoré ou sinon manuellement.

4voto

Aditya Wirayudha Points 485

Hé oui, il m'est arrivé un peu aussi, je pense que dans votre cas, vous devez sous-classer UINavigationController et remplacer les éléments suivants:

     - (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];
    }
 

3voto

Bertl Points 108

Même problème ici. Détendez-vous méthode n'est pas appelée. Ne se produit que lorsque

  • à l'aide de modal segue
  • La présentation est rien mais "contexte actuel"
  • NavigationController n'est pas étendu (en utilisant par défaut du storyboard)

Arrive aussi dans IOS8 Semences GM, donc je pense que nous devons trouver une solution de contournement. Sonne comme un bug pour moi...

L'extension de UINavigationController et la mise en œuvre de viewControllerForUnwindSegueAction n'aide pas, car il n'est pas déclenché. La seule chose qui est exclu est canPerformUnwindSegueAction() à l'intérieur de l'étendue UINavigationController. Étrange.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X