2012-01-10 2 views
10

Je commence maintenant avec Xcode sur iOS pour iOS5 et il y a quelques changements et je traverse maintenant un problème que je n'arrive pas à trouver un moyen de le résoudre .Xcode 4.2 iOS 5: Plusieurs segments d'un UITableView

Je fais un exemple avec un UITablwView qui est peuplé par programmation avec 2 sections, 1ère section avec seulement 1 ligne, et 2ème section avec 3 lignes.

Mon but est de sélectionner une ligne de la table, et en fonction de cette ligne, l'utilisateur sera redirigé vers différentes vues.

Par exemple: section de sélection 0 ligne 0, l'application pousse pour afficher 1 - Réglage du nom // section sélection 1 rang 0, app pousse à voir 3 - réglage de l'adresse

L'ancienne mode, c'est assez simple, juste nécessaire pour initialiser un UIViewController avec initWithNibName, puis appuyez sur la vue. Maintenant, avec le storyBoard tout change, ou du moins je pense qu'il change parce que je ne peux pas voir comment obtenir le même résultat, car je ne peux pas définir plusieurs segue de la tableView à différents UIViewControllers ... et à faire l'ancienne manière je ne peux pas voir où je peux obtenir les noms NIB à partir des vues sur le storyBoard à init un UIViewController à pousser.

Est-ce que quelqu'un sait comment arriver à ce résultat ??

Répondre

25

Définissez deux séquences "génériques" (identifiées par "segue1" et "segue2", par exemple) dans le storyboard depuis votre contrôleur de vue source, un vers chaque contrôleur de vue de destination. Ces enchaînements ne seront associés à aucune action.

Ensuite, effectuez les conditionnellement dans votre UITableViewDelegate enchaînements:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Conditionally perform segues, here is an example: 
    if (indexPath.row == 0) 
    { 
     [self performSegueWithIdentifier:@"segue1" sender:self]; 
    } 
    else 
    { 
     [self performSegueWithIdentifier:@"segue2" sender:self]; 
    } 
} 
+2

réponse fantastique. Fonctionne pour moi aussi. Devrait être accepté comme réponse. – mm24

16

J'ai le même problème que vous. Le problème est que vous ne pouvez pas lier votre tableViewCell à plusieurs contrôleurs de vue. Cependant, vous pouvez lier votre vue de source elle-même à plusieurs contrôleurs de vue.

  1. Control-glisser le contrôleur de vue maître (au lieu de la table cellule de vue) du spectateur de la scène à tout ce contrôleur vue que vous souhaitez associer. Vous pouvez le faire autant que vous le voulez. Notez que la séquence affichée dans la scène du contrôleur de vue source doit être quelque chose comme "Push Segue de Root View Controller ..." au lieu de "Push Segue de NavCell à ...".

  2. Identifier chaque lien Segue un nom unique comme "toDetailView1"

  3. Enfin, faites sur commande la sélection dans vos contrôleurs de vue source:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        if (indexPath.row % 2 == 1) { 
         [self performSegueWithIdentifier:@"toDetailView1" sender:self]; 
        } else { 
         [self performSegueWithIdentifier:@"toDetailView2" sender:self]; 
        } 
    } 
    
+0

+1 a résolu mon problème –

+0

Incroyable! Résolu mon problème! Une question ... Comment puis-je utiliser la même chose pour plus de deux segues. Disons que j'ai 7 cellules tableView. Comment pourrais-je utiliser cela en plus du code que vous avez fourni? –

0

Comme @ 陳仁 乾 et @Marco expliqué était complètement correct. Pour rendre tout un peu plus facile, je vous recommande d'utiliser un seul NSArray qui sera initialisé lorsque viewDidLoad.nommez les mêmes que les enchaînements de votre UIViewControllers, de cette façon vous pouvez afficher une description correcte de ce que UIViewControllers vous pouvez choisir et vous pouvez également effectuer la segues de cette NSArray:

(En fait, je ne sais pas si elle peut causer des problèmes appelant la Segue la même chose que la UIViewController que vous voulez appeler. S'il vous plaît laissez-moi savoir si cela est BadPractise)

viewDidLoad

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _arraySessions = [[NSArray alloc] initWithObjects: 
         @"MyViewControllerName", nil]; 
} 

cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:@"overviewCell" 
            forIndexPath:indexPath]; 

    [cell.textLabel setText:_arraySessions[indexPath.row]]; 

    return cell; 
} 

didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView 
     didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    [self performSegueWithIdentifier:_arraySessions[indexPath.row] 
           sender:self]; 
}