39 votes

Conditionnel segue effectuées sur appuyez sur UITableViewCell

Je suis en train de travailler sur un projet pour iOS 5 en utilisant Xcode 4.2. J'ai un UITableViewController et souhaitez effectuer une transition lorsque l'utilisateur d'appuyer sur une cellule de tableau, mais la destination-vue-contrôleur dépend des mesures effectuées sur cette cellule. Par exemple, lorsque l'utilisateur d'appuyer sur la cellule je voudrais charger SomeViewController, mais lorsque l'utilisateur d'appuyer sur la même cellule en mode d'édition, je tiens à charge AnotherViewController. Malheureusement, il n'y a aucun moyen de le configurer de multiples enchaîne sur une même cellule dans Xcode 4.2 storyboard builder, ou je n'ai tout simplement pas l'obtenir. Peut-être il ya un moyen de créer des enchaînements à la main, dans l'éditeur de code. Généralement ce que je veux réaliser est de fournir à l'utilisateur un moyen de "saisir" l'élément représenté par la cellule à l'aide de l'une-vue-contrôleur et "modifier" l'élément représenté par la même cellule à l'aide d'un autre point de vue contrôleur. Commutation de la seconde vue-contrôleur (éditeur) lorsque dans le tableau-modifier-mode était ma première, mais peut-être il ya une meilleure façon. Toute aide sera appréciée.

54voto

Lemont Washington Points 376

Alors que la recherche plan de montage, de contrôle-faites glisser à partir de votre source de-Vue-Contrôleur à votre Destination-vue-contrôleur. Cela va créer un segue que vous pouvez déclencher par programme à partir de votre source de-Vue-Contrôleur. S'assurer que vous donnez de vous Enchaîner un nom. Ce nom est ce que vous allez passer dans la Vue source du Contrôleur de performSegue:withIdentifier: la méthode.

33voto

Rhubarb Points 16453

Je suis, en ajoutant une réponse juste, parce que, après la lecture de celui sélectionné ci-dessus, dans de nombreux endroits autres que de cela - et c' est la bonne réponse - je me demandais comment faire pour détecter le contact normalement déclencher la séquence. Voyez-vous, si vous créez votre segue la manière habituelle par ctrl-glisser à partir de la vue de la table de la cellule à la suivante contrôleur, puis deux, tout est fait pour vous automatiquement.

  1. le toucher dans la cellule est détecté
  2. la séquence est effectuée

mais bien sûr, vous ne pouvez pas bloquer la séquence.

Maintenant, si vous voulez conditionnellement segue, puis (comme mentionné dans les autres réponses) vous supprimez que segue et en créer un nouveau à partir de la UITableViewController (faites-le glisser à partir des objets navigateur plutôt que de la table de montage séquentiel) à la prochaine contrôleur et lui donner un nom.

Ensuite - et c'est la partie qui me manquait - mettre en oeuvre tableView:didSelectRowAtIndexPath dans votre table view controller pour effectuer la séquence par programme et sous certaines conditions, comme ci-dessous.

Notez que vous devez également identifier votre cellule en quelque sorte, afin de savoir si celui qui vous intéresse a été sélectionné. Vous pourriez le faire en connaissant le chemin d'index dans un tableau statique, mais je préfère mettre mon cellules identificateur unique de l'IB (même si je n'ai pas besoin de lui pour dequeueing puisque c'est un tableau statique) et de les vérifier. De cette façon, si je déplace la cellule vers le haut ou vers le bas dans le tableau statique, je n'aurez pas besoin de modifier ce code.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Find the selected cell in the usual way
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    // Check if this is the cell I want to segue from by using the reuseIdenifier
    // which I set in the "Identifier" field in Interface Builder
    if ([cell.reuseIdentifier isEqualToString:@"CellIWantToSegueFrom"]) {

    // Do my conditional logic - this was the whole point of changing the segue
    if (myConditionForSegueIsSatisfied) {
        // Perform the segue using the identifier I was careful to give it in IB
        // Note I'm sending the cell as the sender because that's what the normal
        // segue does and I already had code counting on that
        [self performSegueWithIdentifier:@"SegueIdentifer" sender:cell];
    }
}

Notez comment j'ai envoyer la cellule avec la séquence normale des enchaînements de la cellule fait ça, et j'avais passé initialement nul, et mon code qui avait dépendu il a cessé de travailler.

0voto

Matt D Points 1

Où est le code qui déchiffre qui segue est nécessaire. Est-il dans didSelectCell méthode? Si le faire, pourquoi s'embêter avec des enchaînements, pourquoi ne pas simplement utiliser la vieille méthode de la poussée et de popping vue des contrôleurs?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X