web-dev-qa-db-fra.com

'Show' segue dans Xcode 6 présente le contrôleur de vue comme modal dans iOS 7

J'ai deux contrôleurs de vue dans mon application iPhone (construite avec Swift) construite avec Xcode 6.1 et qui utilise des storyboards.

Le premier contrôleur de vue est intégré dans un contrôleur de navigation dans le storyboard et la séquence du second contrôleur de vue est une séquence 'Afficher'. 

Lorsque l'application est exécutée, elle affiche correctement la transition en tant que Push dans iOS 8.x, mais sous iOS 7.x, elle apparaît en tant que modal sans la barre de navigation.

Mon exigence d’application est d’afficher la transition en tant que Push, qu’il s’agisse d’iOS 7 ou iOS 8. Des idées pour que cela fonctionne en tant que Push dans les deux versions d’iOS?

J'ai vu un article connexe où ce problème est mentionné, mais je n'ai pas pu trouver de solution: Adaptive segue dans le scénarimage Xcode 6. Le mode Push est-il obsolète?

Toute aide est appréciée ...

Merci

28
momentsnapper

Cette solution est différente des autres des manières suivantes:

  1. Il comprend une méthode pour examiner et vérifier le problème
  2. La cause du problème est attribuée à la source (changement du type de segment)
  3. La solution est très simple (supprimer et recréer une nouvelle séquence)
  4. Veuillez noter les exigences dans le texte

Je viens de donner une réponse très détaillée SO qui explique parfaitement ce qui se passe et pourquoi, mais la solution simple est de supprimer le Segue qui ne pousse pas, puis de le recréer sur le storyboard. La raison en est qu’il existe probablement un fragment cassé de code XML dans la séquence (voir la réponse détaillée pour des exemples/instructions pour savoir comment confirmer ce problème).

Une fois que vous avez confirmé que vous avez au moins un contrôleur UINavigation dans la hiérarchie des vues, assurez-vous que la séquence n’est PAS une séquence manuelle ni une action qui lui est associée (en affichant la séquence dans le storyboard en tant que code source). Supprimez la séquence existante, puis maintenez la touche Ctrl enfoncée et faites glisser un contrôleur UIView/UIControl vers le contrôleur de vue cible. Si une action personnalisée est nécessaire, interceptez l'appel du contrôleur de destination dans prepareForSegue.

Également pour confirmer que cette solution fonctionne pour vous, veuillez faire le Suivant:

  • Vérifiez que votre contrôleur de vue initial (avec la flèche dessus) est un contrôleur UINavigationController et qu'il possède un contrôleur de vue de contenu normal En tant que contrôleur de vue racine. (ou que vous intégriez votre contrôleur de vue initial à l'intérieur d'un UINavigationController)
  • Lisez mes commentaires étendus sur une réponse précédente à une question très similaire (lien ci-dessus).
22
Tommie C.

Il est possible que vous ayez assigné Initial View Controller à votre UIViewController au lieu de UINavigationController. Sélectionnez également votre UIViewController et vérifiez que l’option "Est le contrôleur de vue initial" est-elle désactivée.

Set the UINavigationController as the Initial View Controller

10
jomafer

Ici est la solution de contournement pour cela. Cela ressemble à un bug dans Xcode pour iOS 7. Vous devez créer un UINavigationController factice et lier tous vos UIViewControllers gratuits à ce contrôleur de navigation. Travaillé pour moi.

6
Alina

Je crois que c'est un bug dans Xcode 7.2. Pour contourner le problème, vous pouvez créer une séquence "Push (obsolète)", puis dans l'éditeur de Storyboard, sélectionner la séquence et la changer en Afficher (par exemple, Push)

6
Das

Pour moi, mon storyboard manquait d'un contrôleur de navigation. Je crée le contrôleur de navigation par programme, ce qui fonctionne très bien sous iOS8, mais pas sous iOS7.

SOLUTION

  1. Dans votre storyboard, sélectionnez le contrôleur de vue principal et dans le menu Xcode, choisissez Editor> Intégrer dans> Contrôleur de navigation.
  2. Sélectionnez le nouveau contrôleur de navigation et, dans l'inspecteur d'attributs à droite, sous View Controller, assurez-vous que Is Initial View Controller est coché.
  3. Lancer l'application. Devrait être corrigé maintenant.
4
kwahn

J'ai eu ce problème avec "Show (par exemple. Push)" pendant des années et je viens de le résoudre en essayant de pousser un contrôleur de vue sur un contrôleur de navigation qui est dans un Popover. Il semble que le problème réside dans le contexte du contrôleur de vue appelé. Alors voici comment je l'ai résolu:

  1. Sur le contrôleur de vue effectuant la séquence, cochez la propriété "Définir le contexte" dans le scénarimage.
  2. Dans le contrôleur de vue appelé, définissez la propriété Presentation sur "Contexte actuel".
3
Jeremy Bassett

Je me suis heurté à ce problème et la seule solution qui fonctionne pour moi consiste à utiliser la séquence obsolète 'Push'.

2
ThomasW

J'utilise XCode 9 avec Swift 4. Notez que cette version est sortie hier (20 septembre). 

Pour moi, c'était juste un bug de cache. Je devais choisir "Present Modally", exécuter l'application, puis choisir "Afficher (par exemple Push)". Maintenant tout fonctionne bien.

2
Shanakor

Fondamentalement, la réponse de Jomafer est en partie correcte. Le contrôleur que vous poussez doit être précédé d'un UINavigationController. Vous n'avez pas vraiment besoin de pousser le contrôleur UINavigation du tout. Tant que le storyboard sait qu'il est dans un contrôleur UINavigation, tout va bien.

1
Wesley

Quand une séquence "Show" apparaît comme une séquence modale dans les tests, c'est généralement l'un des deux problèmes suivants:

  1. Le premier contrôleur de vue ne se trouve pas dans un contrôleur de navigation.

  2. Le storyboard XML est corrompu.

La solution au problème n ° 2 consiste généralement à supprimer et à remplacer le segment, qui devrait alors se corriger lui-même. Parfois, le simple fait de passer à un autre style de présentation, de l'exécuter et de revenir à "Afficher" le résout.

Cela peut également arriver aux séquences "Show Detail", et cela peut être plus insidieux.

Exemple: J'ai une série de contrôleurs de vue disposés dans un UISplitViewController. Ils ont des séquences Show-> Show-> Show-> Show Detail. La dernière saison a continué à venir modal. J'ai tout essayé pour réparer cette dernière étape. Le problème était que la séquence amont Show avait été corrompue en une séquence Show Detail (même si le storyboard disait toujours que c’était une séquence Show). J'avais testé sur iPhone et je n'avais pas découvert le vrai problème avant de l'avoir exécuté sur le simulateur iPad. Les séquences étaient maintenant Afficher-> Afficher -> Afficher les détails -> Afficher les détails. Sur l'iPhone, la troisième séquence ressemblait à un spectacle, car elle s'était effondrée sur le contrôleur de navigation. Cependant, il s'agit toujours du contrôleur de vue detail , et vous ne pouvez pas utiliser un contrôleur de vue de détail from , de sorte que le système d'exploitation fait tout son possible pour afficher votre contrôleur de vue à l'écran et l'affiche sous forme modale.

Leçon 1: testez toujours votre UISplitViewController sur iPad pour vous assurer que les ligues font ce que vous pensez. 

Leçon 2: Si votre segment arrive modal de manière inattendue, vérifiez si le segment amont / segues est corrompu, ainsi que le segment en question.

0
DrSmart

Le problème dans mon cas était que j'ai créé Show (par exemple, Push) segue avant mettant ViewController en tant que rootViewController de UINavigationController. En d'autres termes, je n'avais pas UINavigationController . Puis j'ai supprimé seque, ajouté UINavigationController et ajouté de nouveau seque et cela a fonctionné. Testé sur Xcode 9.0.1/iOS 11.0.3.

0
Josip B.