Le constructeur d'interface Xcode 6 a par défaut une nouvelle case à cocher "utiliser les classes de taille". Cela rend les vues adaptatives.
Lorsque j'essaye de faire la transition entre 2 vues dans mon storyboard, j'ai de nouvelles options:
plutôt vieux:
Maintenant, nous avons "show" et "present modal" au lieu de "push" et "modal". Les anciennes options sont marquées comme obsolètes. J'ai choisi l'option "afficher", car dans les paramètres de segue, elle s'appelait "show (par exemple, push)
Mais ça ne pousse pas. L'animation Segue ressemble à une diapositive à partir du bas (modale) et la barre de navigation disparaît.
La question est: Comment puis-je faire fonctionner "show" comme push? Est-ce possible ou devrais-je utiliser "push (obsolète)" à la place? Où puis-je trouver des informations sur les nouveaux types de segue? La seule chose que j'ai trouvée dans la bibliothèque des développeurs iOS8 est les storyboards qui vous aident à concevoir votre interface utilisateur, mais il n'y a aucune information sur la séquence "show".
METTRE À JOUR
J'ai essayé de créer un nouveau projet et "show" fonctionne vraiment comme "push". Je pense que le problème dans mon projet peut être dû au fait que je réutilise le contrôleur de navigation avec un code comme celui-ci, mais je ne sais pas comment le résoudre.
if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) {
SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;
swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
[navController setViewControllers: @[dvc] animated: NO ];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
};
}
Après cela, j'essaye de pousser NewViewController après MainViewController
MISE À JOUR 2:
Il semble que je ne sois qu'un problème avec iOS 7, iOS 7.1.
la source
Il y a déjà une réponse acceptée, mais je voulais donner un peu plus d'informations, peut-être des informations qui n'étaient pas disponibles auparavant.
Comme mentionné précédemment, les segments "push" et "modal" ont été désapprouvés et ont été remplacés respectivement par "show" et "present modally". Selon la documentation d'Apple, les nouvelles segues ont été divisées en segments qui s'adaptent aux classes de taille. Les plus anciens ne doivent être utilisés que pour prendre en charge les versions iOS antérieures à iOS 8.
Le document dans le lien suivant explique cela et la description de tous les segments disponibles, anciens et nouveaux.
Ajout d'un segment entre les scènes dans un storyboard
Au cas où l'URL changerait à l'avenir, voici l'explication donnée pour chaque nouvelle séquence:
la source
Il n'y a rien de mal avec les autres réponses, mais celle-ci explique ce qui se passe, comment vous pouvez vérifier que cela se produit et comment atténuer le problème à l'avenir.
Contexte
Dans mon cas, aucun de mes Show Segues ne fonctionnait même si j'avais déjà un UINavigationController comme contrôleur de vue initial (avec mon contenu UIViewController comme root).
Pourquoi et comment le show Segue se rompt
La séquence Afficher s'interrompt lorsqu'une action est associée à la séquence dans le xml source du storyboard. Un scénario typique à l'origine de cela pourrait être si vous avez redéfini une segue à partir d'un segue manuel précédemment appelé dans le code. Cela laisse les éléments suivants dans le storyboard xml.
Pour s'adapter à toutes les actions personnalisées lors de l'utilisation du segue à partir du storyboard, il suffit de taper sur prepareForSegue et d'intercepter le contrôleur de vue de destination et d'appeler toutes les méthodes à partir de cet emplacement. Dans tous les cas, l'effet secondaire de ce petit bogue (le bogue est le fait que lorsque vous redéfinissez la segue elle n'est pas correctement configurée en xml ~ c'est à dire que l'action reste même après avoir changé la segue en une qui opère à partir d'un UIView (ou UIControl) vers un contrôleur de vue cible).
Malheureusement, la solution la plus directe échoue. Donc, simplement supprimer l'attribut xml pour l'action dans le Storyboard ne résoudra PAS le problème. Au lieu de cela, il faut simplement supprimer et recréer la séquence dans le storyboard.
Une fois recréé, le storyboard xml n'aura plus d'action associée à la séquence particulière et le spectacle s'exécutera en tant que Push.
Exemple de XML pour un Show Segue correct
Atténuation
Pour éviter la récurrence, il suffit de s'en tenir aux segues de storyboard non manuels si possible en utilisant le prepareForSegue pour ajouter les actions requises en fonction du contrôleur de vue de destination. Ou si vous devez mélanger et assortir, prenez la précaution de vérifier que vos segues Show n'ont aucune action attachée dans le storyboard xml. Si vous avez affaire à des projets plus anciens, vous devez accorder une attention particulière au code source de Storyboard car j'ai découvert quelques problèmes.
la source
Comme Scott Robertson l'a commenté ici , cela ressemble à un bogue dans iOS 7.
Il semble que dans iOS 8, la transition soit déduite à l'exécution (comportement correct), tandis que dans iOS 7, la transition est déduite au moment de la conception (comportement bogué).
La solution de contournement la plus simple consiste à ajouter un contrôleur de navigation inutilisé au storyboard et à le lier afin que le contrôleur de vue en question fasse partie de ce contrôleur de navigation. Vous n'avez pas réellement besoin d'instancier le contrôleur de navigation, vous avez juste besoin du contrôleur de vue buggy pour savoir qu'il est intégré dans un contrôleur de navigation.
Remarque: la simulation d'une barre de navigation n'est pas suffisante à ces fins; vous devez en fait avoir un contrôleur de navigation dans sa pile de push.
Pour reproduire le bug:
initWithRootViewController:
méthode.Pour corriger le bogue:
workaround for show segues in iOS 7
).Remarquez comment le contrôleur de navigation a été ajouté dans la deuxième image, et comment il n'a pas de flèches entrantes (c'est-à-dire qu'il n'y a aucun moyen de l'instancier autrement qu'en utilisant son identifiant de contrôleur de vue).
la source
Je sais que je suis en retard mais je voulais partager ce que j'ai appris. Il s'agit en fait d'un bug et est toujours présent aujourd'hui (18/12/2014).
J'ai écrit un article à ce sujet ici .
Il est facilement reproductible; sur iOS8 fonctionnera très bien et même dans iOS7.x tant que vous ne poussez pas un contrôleur de vue par programme dans la pile avant d'appeler le
Show
segue.Si vous poussez uniquement vers la pile en utilisant des connexions de storyboard, cela fonctionnera; mais apparemment, si vous poussez via le code, la
navigationController
propriété du pushUIViewController
seranil
et quand vous appelezShow
il supposera que c'est un modal car il n'y a pas de navigation pour contrôler la pile.La seule solution de contournement jusqu'à présent est de ne pas pousser via le code (pas faisable) ou d'utiliser le désormais obsolète
Push
.J'ai déposé un radar (lien sur l'article). N'hésitez pas à déposer des doublons dans l'espoir qu'Apple corrige ce problème.
la source
Show
puis sur la deuxièmeShow
séquence, elle est présentée modalement, Solution?Show
d'un viewController sur iOS 7J'ai eu le même problème avec les segues dans Xcode 7 et iOS 7.1.2. Afficher les segues (nouvelle fonctionnalité d'iOS 8) fonctionne comme les segues modales dans iOS 7 et ne vous permet pas de pousser vos contrôleurs de vue dans la pile du contrôleur de navigation lorsque vous définissez le type de segue avec Xcode dans votre Storyboard. C'est pourquoi votre self.navigationController renverra nil, car le contrôleur de vue n'a pas été poussé vers la pile et vous ne pouvez pas le faire apparaître.
Je ne comprends pas pourquoi Apple n'a ajouté aucune notification pour ce cas dans Xcode lorsque vous avez besoin que votre application fonctionne sur iOS 7. Ils disent que la méthode Push est obsolète, mais Show ne fonctionne pas correctement avec iOS 7.
Qu'ai-je fait pour résoudre le problème:
J'ai créé la classe MYShowSegue avec .h
Et fichier .m avec une seule méthode perform :
Ensuite, vous devez définir un type personnalisé pour chaque suite dans votre Storyboard et sélectionner une nouvelle classe pour cela, dans mon cas, c'était MYShowSegue.
Exemple de segment personnalisé
Cette solution vous aidera à obtenir un support complet de vos applications iOS 7, elles utiliseront la méthode pushViewController pour pousser vos vues et pour iOS 8,9 etc. votre segue fonctionnera avec la nouvelle méthode (iOS 8) showViewController
N'oubliez pas de faire de même avec toutes vos segues dans votre Storyboard.
la source
Cela se produit toujours dans iOS 10.x
La suppression et la réinstallation de segues n'ont rien résolu pour moi:
Problème: la fonctionnalité requise était de 7 segues qui ne fonctionnent que comme un «push» (en fait un show Detail) mais en fait seule la première segue que j'ai ajoutée pousserait, les autres se comporteraient toutes de manière modale. Ceci malgré qu'Interface Builder décrive chacun des segments de manière identique.
Solution: j'ai dû ajouter l'action aux 6 segues qui ne l'avaient pas.
XML du storyboard original
J'ai changé cela en ajoutant showViewController: sender
la source