12
votes

Changement de contrôleur d'affichage lorsque le contrôle segmenté change

Ce problème me rend fou. J'essaie de changer le ViewController lorsque l'utilisateur modifie l'onglet sélectionné de la commande segmentée. J'ai passé quelques heures à rechercher et je n'ai pas été en mesure de trouver une réponse qui fonctionne ou est faite via Storyboard.

Cela me dérange vraiment car définir une application d'onglet est si facile, mais essayant d'utiliser le contrôle segmenté comme l'application de l'onglet ne fonctionne tout simplement pas. Je sais déjà comment détecter quel index est sélectionné dans le contrôle segmenté. Comment puis-je atteindre cet objectif?

Merci beaucoup.


2 commentaires

Essayez-vous d'échanger une vue Voir ou un contrôleur Voir ? Ils sont deux choses différentes. Si ce dernier, je suggérerais de tout rouler dans un contrôleur d'affichage et montrer ou masquer des sous-espoirs comme ils sont nécessaires.


Eh bien, je suis vraiment nouveau dans IOS, la chose la plus simple qui me vient à l'esprit est de changer la mentalité de vue comme une application à onglets. Vous suggérez-vous de faire diverses vues et de les gérer avec le même contrôleur d'affichage? Si oui, comment puis-je faire ça? Merci beaucoup


4 Réponses :


0
votes

UisegmentedControl est un peu différent en ce sens qu'il n'a pas de protocole de délégué, vous devez utiliser le style "Ajouter la cible". Dans votre cas ce que vous voulez faire, c'est ajouter une cible à être notifiée lorsque les modifications UISEgmentedControl (qui est probablement le contrôleur de vue parent), puis cette cible peut traiter la commutation d'onglet.

Par exemple: P>

- (void)changedSegmentedControl:(id)sender
{
   UISegmentedControl *ctl = sender;
   NSLog(@"Changed value of segmented control to %d", ctl.selectedSegmentIndex);
   // Code to change View Controller goes here
}


0 commentaires

42
votes

Remarque: Réponse mise à jour avec vue Code de confinement du contrôleur pour iOS 5+ y compris @interface section forte>

dans une application de mine, j'ai un contrôleur d'affichage avec un contrôle de segment dans la barre de navigation et En cliquant sur les "onglets", utilisez les contrôleurs de vue. L'idée de base est d'avoir une gamme de contrôleurs d'affichage et de basculer entre eux à l'aide de l'index de segment (et de l'indexdidchangeforSefortsControl Ibaction. P>

code d'exemple (iOS 5 ou ultérieure) de mon application (ceci est pour 2 contrôleurs d'affichage Mais il est trivialement étendu à plusieurs contrôleurs d'affichage); le code est légèrement plus long que pour iOS 4 mais conservera le graphique d'objet intact. De plus, il utilise ARC: P>

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];

    // Create the score view controller
    AddHandScoreViewController *score = [self.storyboard instantiateViewControllerWithIdentifier:@"AddHandScore"];

    // Create the penalty view controller
    AddHandPenaltyViewController *penalty = [self.storyboard instantiateViewControllerWithIdentifier:@"AddHandPenalty"];

    // Add Score and Penalty view controllers to the array
    self.allViewControllers = [[NSArray alloc] initWithObjects:score, penalty, nil];

    // Ensure the Score controller is loaded
    self.switchViewControllers.selectedSegmentIndex = 0;
    [self switchToController:[self.allViewControllers objectAtIndex:self.switchViewControllers.selectedSegmentIndex]];
}

#pragma mark - View controller switching and saving

- (void)switchToController:(UIViewController *)newVC
{
    if (newVC) {
        // Do nothing if we are in the same controller
        if (newVC == self.currentViewController) return;

        // Remove the current controller if we are loaded and shown
        if([self.currentViewController isViewLoaded]) [self.currentViewController.view removeFromSuperview];

        // Resize the new view controller
        newVC.view.frame = CGRectMake(CGRectGetMinX(self.view.bounds), CGRectGetMinY(self.view.bounds), CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds));

        // Add the new controller
        [self.view addSubview:newVC.view];

        // Store a reference to the current controller
        self.currentViewController = newVC;
    }
}

- (IBAction)indexDidChangeForSegmentedControl:(UISegmentedControl *)sender {

    NSUInteger index = sender.selectedSegmentIndex;

    if (UISegmentedControlNoSegment != index) {
        UIViewController *incomingViewController = [self.allViewControllers objectAtIndex:index];
        [self switchToController:incomingViewController];
    }

}


5 commentaires

Vraiment belle solution. Merci de partager cela.


@Robotic Cat: Je suis un peu confus pourquoi vous définissez le cadre du contrôleur de vue enfant pour être identique à celui du contrôleur de vue parent. Ce contrôleur de visualisation parent ne contient-il pas le fichier UISEGHEGEDCONTROL? Si oui, le contrôleur de la vue enfant ne serait-il pas obscurcier?


@MaResoft: Habituellement, le uisegsedControl est dans la barre de navigation. Évidemment, si votre uisegmentedControl est dans votre contrôleur d'affichage, vous devez définir vos contraintes de fonctionnement automatique ou image sur les valeurs correctes pour votre application.


C'est un bon exemple. Je reçois un crash exc_bad_address lorsque je touche le contrôle segmenté (iOS 6, premier exemple). Il a la sensation de quelque chose de base, comme si j'ai construit quelque chose de mal dans le storyboard. Indicateurs: 1) Dans le débogueur, lorsque je touche le contrôle, j'ai correctement une vieillevc et un nouveauvc, mais une fois que le bloc d'achèvement est exécuté, il n'y a plus de vieillevc. Y a-t-il un problème avec la clause «autre»? 2) Lorsque la vue de première charge, l'étiquette de test dans la vue n'est pas centrée verticalement (comme elle devrait être) - bien que l'étiquette de test de la seconde vue soit correctement centrée. Des pensées? Merci!


En pensant à cette différence de mise en page de texte, j'ai désactivé l'autolayouet et le contrôle segmenté commute correctement les contrôleurs de vue (Xcode 4.6.3). Considérez cela résolu.



5
votes

Je dirais que c'est beaucoup plus simple de changer de sous-espion dans un uiviewcontroller , vous pouvez configurer vos sous-espoirs dans vos storyboards et les connecter avec ibouletts dans votre contrôleur vous peut définir la propriété masqué de vos vues sur Oui ou NO Selon le contrôle qui a été cliqué sur.

Maintenant, si vous utilisez une approche de CAT @robotic qui est également une bonne solution, vous pouvez avoir un peu plus de modularité dans la manière dont votre application fonctionne, envisagée de placer toute votre logique dans un contrôleur à l'aide de la solution que j'ai présentée.


3 commentaires

J'aime que votre suggestion vient de l'essayer sur Xcode et a l'air bien et facile à mettre en œuvre. Ma seule préoccupation est-elle inefficace d'avoir des vues cachées à l'arrière-plan?


Je n'ai rien lu dans Te Developer Docs qui va à l'encontre de cela, même si vous devez considérer que si vous ajoutez beaucoup d'éléments visuels, cela prendra la mémoire, alors faites-le judicieusement. Pour éviter cela, vous pouvez réaliser tout ce dont vous avez besoin à la volée, même si je crois que les frais généraux d'avoir tous les éléments déjà mis en place sont minimes. Je n'ai que 4 sous-espions avec 1 ou 2Fields de texte par exemple.


Dans l'une de mes applications iPad, j'ai un contrôleur d'affichage qui dispose de 7 sous-visions qui pourraient être montrées ou cachées, chacune avec son propre ensemble de contrôles. Au total, il y a environ 60 vues et sous-devises (étiquettes, boutons, etc.). Je ne remarque aucune lenteur ou une hésitation, et le Profier ne révèle pas d'énormes pointes en mémoire ni à la CPU. De toute évidence, vous devriez tester soigneusement votre propre solution, mais je doute que vous ayez un problème.



0
votes

Jetez un coup d'oeil à ce pod: https://github.com/xmartlabs/xlmAilboxContainer . Il rend l'animation d'interface utilisateur parmi les contrôleurs d'affichage. Ce contrôleur d'affichage peut prolonger utailviewController ou tout autre contrôleur d'affichage.

J'espère que cela vous aidera!


0 commentaires