instantiate - viewcontroller without storyboard




Séquence adaptative dans le storyboard Xcode 6. La poussée est-elle déconseillée? (5)

Le constructeur de l'interface Xcode 6 a par défaut une nouvelle case à cocher "Utiliser les classes de taille". Cela rend les vues adaptatives.

Quand j'essaie de faire une séquence entre 2 vues dans mon storyboard, j'ai de nouvelles options:

plutôt vieux:

Maintenant nous avons "montrer" et "présenter modalement" au lieu de "pousser" et "modal". Les anciennes options sont marquées comme obsolètes. J'ai choisi l'option "show", car dans les paramètres de segue, elle s'appelle "show" (par exemple "push")

Mais ça ne fait pas pousser. L'animation Segue ressemble à une diapositive du bas (modal) et la barre de navigation disparaît.

La question est: Comment puis-je faire "show" travailler comme pousser? Est-il possible ou devrais-je utiliser "push (deprecated)" à la place? Où puis-je trouver des informations sur les nouveaux types de segue? La seule chose que j'ai trouvé dans la bibliothèque de développeur iOS8 est Storyboards vous aider à concevoir votre interface utilisateur, mais il n'y a pas d'informations sur "show" segue.

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 parce que je réutilise le contrôleur de navigation avec le code comme ceci, mais je ne sais pas comment le réparer.

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'essaie de pousser NewViewController après MainViewController

MISE À JOUR 2:

Je semble être seulement iOS 7, iOS 7.1 question.


tldr; Supprimez le Segue qui ne pousse pas correctement et recréez-le dans le storyboard en faisant glisser depuis un UIView / UIControl vers le contrôleur de vue cible.

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, aucune de mes Segues Show ne fonctionnait même si j'avais déjà un UINavigationController en tant que contrôleur de vue initial (avec mon contenu UIViewController en tant que root).

Pourquoi et comment le salon Segue se brise

Le show segue se brise quand il a une action associée à la section dans le fichier XML source du storyboard. Un scénario typique provoquant ceci pourrait être si vous avez redéfini une section à partir d'une séquence manuelle appelée auparavant dans le code. Cela laisse les bits suivants dans le fichier XML du storyboard.

<connections>
    <segue destination="85t-Z1-hxf" kind="show" identifier="ToOptions" action="showDetailViewController:sender:" id="gdZ-IX-KcN">
</connections>

Nota Bene Pour voir le storyboard en tant que xml; Cliquez avec le bouton droit sur le fichier du storyboard et choisissez Ouvrir en tant que> Code source . Pour revenir à l'utilisation Ouvrir sous> Interface Builder - Storyboard

Pour prendre en compte les actions personnalisées lors de l'utilisation de la section depuis le storyboard, il suffit de taper dans prepareForSegue et d'intercepter le contrôleur de vue de destination et d'appeler toutes les méthodes à partir de cet emplacement. En tout cas, l'effet secondaire de ce petit bug (le bug est le fait que lorsque vous redéfinissez la section, elle n'est pas correctement configurée dans xml ~ ie l'action reste même après que vous changez la section à celle qui fonctionne depuis un UIView (ou UIControl) vers un contrôleur de vue cible).

Malheureusement, la solution la plus directe échoue. Donc, le simple fait de supprimer l'attribut xml de l'action dans le Storyboard ne résoudra PAS le problème. Au lieu de cela, il suffit de supprimer et de recréer la section dans le storyboard.

Une fois recréé, le storyboard xml n'aura plus d'action associée à la section particulière et le Show s'exécutera en tant que Push.

Exemple de fichier XML pour afficher correctement Segue

  <connections>
    <segue destination="RbV-Au-WV9" kind="show" identifier="ToOptions" id="5dm-os-bcS"/>
  </connections>

Atténuation

Pour éviter la récurrence, il suffit de s'en tenir à des séquences de storyboard non-manuelles si possible en utilisant 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 séquences n'apparaissent pas dans le script xml. Si vous avez affaire à des projets plus anciens, vous devriez accorder une attention particulière au code source du Storyboard car j'ai découvert quelques problèmes.


Cela se passe 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 secondes qui ne fonctionnent que comme un 'push' (en fait un show Detail) mais en fait, seul le premier segment que j'ajouterais pousserait, les autres se comporteraient tous modalement. Ceci en dépit de l'Interface Builder décrivant chacune des pages de manière identique.

Solution: J'ai dû ajouter l'action aux 6 segues qui ne l'avaient pas.

Storyboard original XML

<connections>
  <segue destination="tIr-4a-WfZ" kind="showDetail" identifier="A" action="showViewController:sender:" id="8yd-Ne-7KA"/>
  <segue destination="4mB-YE-5dM" kind="showDetail" identifier="B" id="Uod-JC-786"/>
  <segue destination="Qh5-bJ-KcE" kind="showDetail" identifier="C" id="3PW-nV-hWl"/>
  <segue destination="EI6-f4-QBB" kind="showDetail" identifier="D" id="WUK-ju-KDm"/>
  <segue destination="nTz-N4-fpW" kind="showDetail" identifier="E" id="Id6-bW-Huc"/>
  <segue destination="JEp-CH-6dW" kind="showDetail" identifier="F" id="G0L-XW-7f4"/>
  <segue destination="AET-S1-O6h" kind="showDetail" identifier="G" id="3NK-93-wTy"/>
</connections>

J'ai changé cela en ajoutant showViewController: expéditeur

<connections>
  <segue destination="tIr-4a-WfZ" kind="showDetail" identifier="A" action="showViewController:sender:" id="8yd-Ne-7KA"/>
  <segue destination="4mB-YE-5dM" kind="showDetail" identifier="B" action="showViewController:sender:" id="Uod-JC-786"/>
  <segue destination="Qh5-bJ-KcE" kind="showDetail" identifier="C" action="showViewController:sender:" id="3PW-nV-hWl"/>
  <segue destination="EI6-f4-QBB" kind="showDetail" identifier="D" action="showViewController:sender:" id="WUK-ju-KDm"/>
  <segue destination="nTz-N4-fpW" kind="showDetail" identifier="E" action="showViewController:sender:" id="Id6-bW-Huc"/>
  <segue destination="JEp-CH-6dW" kind="showDetail" identifier="F" action="showViewController:sender:" id="G0L-XW-7f4"/>
  <segue destination="AET-S1-O6h" kind="showDetail" identifier="G" action="showViewController:sender:" id="3NK-93-wTy"/>
</connections>

Il y a déjà une réponse acceptée, mais je voulais donner un peu plus d'informations, éventuellement des informations qui n'étaient pas disponibles auparavant.

Comme nous l'avons mentionné précédemment, les enchaînements «push» et «modal» ont été déconseillés et ont été remplacés par «show» et «present modally» respectivement. Selon la documentation d'Apple, les nouvelles pages ont été divisées en segments qui s'adaptent aux classes de taille. Les plus anciens ne devraient être utilisés que pour supporter les versions iOS antérieures à iOS 8.

Le document dans le lien suivant explique cela et la description de toutes les segues disponibles, anciennes et nouvelles.

Ajouter une séquence entre les scènes d'un storyboard

Au cas où l'URL changerait dans le futur, voici l'explication donnée pour chaque nouvelle section:

Montrer

Présentez le contenu dans la zone de détail ou la zone principale en fonction du contenu de l'écran. Si l'application affiche une vue principale et détaillée, le contenu est placé dans la zone de détail. Si l'application affiche uniquement le maître ou le détail, le contenu est placé au-dessus de la pile du contrôleur de vue en cours.

Montrer les détails

Présentez le contenu dans la zone de détail. Si l'application affiche une vue principale et détaillée, le nouveau contenu remplace le détail actuel. Si l'application affiche uniquement le maître ou le détail, le contenu remplace le haut de la pile du contrôleur de vue en cours.

Présent Modalement

Présentez le contenu de manière modale. Il existe des options pour choisir un style de présentation (UIModalPresentationStyle) et un style de transition (UIModalTransitionStyle).

Présent comme Popover

Présentez le contenu en tant que popover ancré à une vue existante. Il existe une option pour spécifier les directions possibles de la flèche affichée sur un bord de la vue popover (UIPopoverArrowDirection). Il y a aussi une option pour spécifier la vue d'ancre.


J'ai eu le même problème avec des segues dans Xcode 7 et iOS 7.1.2. Afficher les segments (nouvelle fonctionnalité d'iOS 8) fonctionne comme les segments modaux dans iOS 7 et ne vous permet pas d'insérer vos contrôleurs View dans la pile du contrôleur de navigation lorsque vous définissez le type de segment avec Xcode dans votre Storyboard. C'est pourquoi votre self.navigationController renverra zéro, car le View Controller 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 pas ajouté de notifications pour ce cas dans Xcode lorsque vous avez besoin que votre application fonctionne sur iOS 7. Ils disent que la méthode Push est dépréciée, mais que 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

#import <UIKit/UIKit.h>

@interface MYShowSegue : UIStoryboardSegue

@end

Et le fichier .m avec une seule méthode d' exécution :

#import "MYShowSegue.h"

@implementation MYShowSegue

- (void) perform {

    if ([[[self sourceViewController] navigationController] respondsToSelector:@selector(showViewController:sender:)]) {

        id sender = nil;
        [[[self sourceViewController] navigationController] showViewController:[self destinationViewController] sender:sender];
    }else{

        [[[self sourceViewController] navigationController] pushViewController:[self destinationViewController] animated:YES];
    }
}

@end

Ensuite, vous devez définir un type Personnalisé pour chaque section de votre Storyboard et en sélectionner une nouvelle, dans mon cas c'était MYShowSegue.

Exemple de Segue personnalisé

Cette solution va vous aider à obtenir un support complet de vos applications iOS 7, ils vont utiliser 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'oublie pas de faire de même avec toutes tes séquences dans ton Storyboard.


Oui, utilisez 'Show' au lieu de 'Push'

Comment puis-je faire "show" travailler comme pousser? Est-il possible ou devrais-je utiliser "push (depricated)" à la place?

Cela devrait; ça fait pour moi. J'utilise Xcode 6 beta 2 et pour tester j'ai utilisé le modèle de vue unique (appelant le contrôleur de vue pré fait dans IB 'VC_A'). J'ai ensuite ajouté un autre contrôleur de vue ('VC_B'). J'ai ensuite ajouté un bouton sur VC_A pour montrer VC_B et un autre de VC_B à VC_A. Lorsque j'ajoute un contrôleur de navigation en tant que contrôleur de vue initial dans le storyboard et que je rend VC_A rootViewController, les deux options 'push' et 'show' ont le même effet. Si je n'ai pas de contrôleur de navigation initial et que j'utilise 'show', j'obtiens ce que vous avez décrit en ce que le VC_B fait un slide depuis le bas. Si j'essaie de 'pousser', je reçois un crash car pour faire pousser je dois avoir un contrôleur de navigation. Il semblerait donc que 'show' fasse un push dans le cas où un contrôleur de navigation est fourni et fasse un cadeau avec un style de transition modale si un contrôleur de navigation n'est pas présent.

Où puis-je trouver des informations sur les nouveaux types de segue?

J'ai donc trouvé quelques informations dans la session 'Nouveautés d'Interface Builder' here . Si vous regardez les diapositives, vous verrez une diapositive (41) mentionner le changement. Lorsque vous regardez cette vidéo de session, vous pouvez passer à la minute 38:00 où ils commencent à parler de segues adaptatives. Ils expliquent que la séquence adaptative 'show', par exemple, prend en compte le contexte pour décider comment faire la présentation d'un nouveau contrôleur de vue.