'Show' segue dans Xcode 6 présente le viewcontroller comme un modal dans iOS 7

J'ai deux controllers de vue dans mon application iPhone (construit avec swift) construit avec Xcode 6.1 et utilise des storyboards.

Le premier controller de vue est embedded dans un controller de navigation dans le storyboard et la séquence du second controller de vue est une section "Show".

Lorsque l'application est exécutée, elle affiche correctement la transition sous la forme d'une poussée dans iOS 8.x, mais dans iOS 7.x, elle apparaît comme modale sans la barre de navigation.

Mon exigence d'application est de montrer la transition comme un push indépendamment du fait que ce soit iOS 7 ou iOS 8. Des idées pour que cela fonctionne comme pousser dans les deux versions de l'iOS?

J'ai vu un article connexe où ce problème est mentionné, mais je n'ai pas trouvé de solution au problème: Adaptive segue dans le storyboard Xcode 6. Est-ce que le push est déprécié?

Toute aide est appréciée …

Merci

Cette solution est différente des autres de la manière suivante:

  1. Il comprend une méthode pour examiner et vérifier le problème
  2. La cause du problème est tracée à la source (un changement dans le type de segue)
  3. La solution est très simple (supprimer et recréer une nouvelle section)
  4. S'il vous plaît noter les exigences dans le text

Je viens de donner une réponse SO très détaillée qui explique pleinement ce qui se passe et pourquoi, mais la solution simple est que vous pouvez supprimer le Segue qui ne pousse pas, puis le recréer sur le storyboard. La raison en est qu'il y a probablement un peu de xml brisé dans la section (voir réponse étendue par exemple / instructions comment confirmer ce problème).

Après avoir confirmé que vous avez au less un UINavigationController dans la hiérarchie de la vue, assurez-vous que la section n'est PAS une section manuelle et qu'elle n'a pas d'action associée (en affichant la séquence dans le storyboard comme code source). Supprimez le segue existant, puis faites Ctrl-glisser depuis un UIView / UIControl vers le controller de vue cible et si une action personnalisée est nécessaire, interceptez l'appel au controller de destination dans prepareForSegue .

Aussi pour confirmer que cette solution fonctionne pour vous, procédez comme suit:

  • Vérifiez que votre controller de vue initial (avec la flèche dessus) est un UINavigationController et qu'il a un controller de vue de contenu normal car il est controller de vue racine. (ou que vous intégrez votre controller de vue initial à l'intérieur d'un UINavigationController)
  • Lisez mes commentaires étendus sur une réponse antérieure à une question très similaire (ci-dessus).

Il est possible que vous ayez affecté le controller de vue initial à votre UIViewController au lieu du UINavigationController. En outre, select votre UIViewController et vérifiez que l'option "Is Initial View Controller" n'est pas cochée.

Définir UINavigationController en tant que contrôleur de vue initial

Voici la solution de contournement pour cela. Cela ressemble à un bogue dans Xcode pour iOS 7. Vous devez créer un UINavigationController fictif et lier tous vos UIViewControllers libres à ce controller de navigation. A travaillé pour moi.

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

SOLUTION

  1. Dans votre storyboard, select le controller de la vue principale et, dans le menu Xcode, choisissez Editeur> Incorporer dans> Contrôleur de navigation .
  2. Sélectionnez le nouveau controller de navigation, et dans l'inspecteur d'attributes sur la droite, sous View Controller , assurez-vous que l' option Initial View Controller est cochée.
  3. Lancez l'application Devrait être réparé maintenant.

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

J'ai eu ce problème exact avec "Show (par exemple Push)" depuis des lustres et je l'ai juste compris tout en essayant de pousser un controller de vue sur un controller de navigation qui est dans un Popover. Il semble que le context du controller de vue appelé est le problème. Donc voici comment je l'ai résolu:

  1. Sur le View Controller exécutant la Segue, vérifiez la propriété "Defines Context" dans le Storyboard.
  2. Dans le View Controller appelé, définissez la propriété Presentation sur "Current Context".

Je me suis heurté à ce problème et la seule solution que j'ai trouvée qui fonctionne pour moi est d'utiliser le "Push" segue obsolète.

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

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

Pour moi, c'était juste un bug de caching. J'ai dû choisir "Présenter Modalement", lancer l'application et ensuite choisir "Montrer (par exemple Pousser)". Maintenant tout fonctionne bien.

Le problème dans mon cas était que j'ai créé Show (par exemple Push) segue avant de mettre 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é seque encore et cela a fonctionné. Testé sur Xcode 9.0.1 / iOS 11.0.3.