web-dev-qa-db-fra.com

Segue conditionnelle effectuée au robinet sur UITableViewCell

Je travaille sur un projet pour iOS 5 utilisant Xcode 4.2. J'ai un UITableViewController et je souhaite effectuer une séquence lorsque l'utilisateur appuie sur une cellule du tableau, mais le contrôleur de vue de destination dépend de l'action effectuée sur cette cellule. Par exemple, lorsque l'utilisateur appuie sur une cellule, j'aimerais charger SomeViewController, mais lorsqu'il appuie sur la même cellule en mode d'édition, j'aimerais charger AnotherViewController. Malheureusement, il n'y a aucun moyen de configurer plusieurs segments sur une même cellule dans le constructeur de storyboard Xcode 4.2, ou je ne comprends tout simplement pas. Peut-être existe-t-il un moyen de créer segue manuellement à l'aide d'un éditeur de code. En règle générale, je souhaite fournir à l'utilisateur un moyen de "saisir" l'élément représenté par une cellule à l'aide d'un contrôleur de vue et d '"éditer" l'élément représenté par la même cellule à l'aide d'un autre contrôleur de vue. Passer au deuxième contrôleur de vue (éditeur) en mode édition de table seulement était cependant mon premier choix, mais il existe peut-être un meilleur moyen. Toute aide serait appréciée.

39
Darrarski

Tout en regardant dans Storyboard, faites glisser votre contrôleur de vue source vers votre contrôleur de vue Destination tout en maintenant la touche Contrôle enfoncée. Cela créera une séquence que vous pourrez déclencher par programme directement à partir de votre View Controller source. Assurez-vous de vous donner un nom à Segue. Ce nom correspond à ce que vous allez transmettre à la méthode performSegue: withIdentifier: du contrôleur source de View View.

54
Lemont Washington

J'ajoute une réponse supplémentaire simplement parce qu'après avoir lu celle sélectionnée ci-dessus dans de nombreux endroits autres que celui-ci - et il est la réponse correcte - Je me suis demandé comment détecter le toucher qui déclencherait normalement la transition . Vous voyez, si vous créez votre séquence de la manière habituelle en faisant un glisser-déposer de la cellule de la vue tableau vers le contrôleur suivant, vous effectuez automatiquement deux opérations.

  1. le contact dans la cellule est détecté
  2. le segue est effectué

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

Maintenant, si vous voulez conditionnellement Segue, alors (comme indiqué dans les autres réponses), supprimez cette séquence et créez-en une nouvelle à partir de UITableViewController (faites-la glisser du navigateur d'objets plutôt que du storyboard) vers la suivante. contrôleur - et lui donner un nom.

Ensuite - et ceci est la partie qui me manquait - implémentez tableView:didSelectRowAtIndexPath dans votre contrôleur de vue de table pour effectuer le changement de séquence par programme et conditionnellement, comme indiqué ci-dessous.

Notez que vous devez également identifier votre cellule afin de savoir si celle qui vous intéresse a été sélectionnée. Vous pouvez le faire en connaissant le chemin d'index dans une table statique, mais je préfère définir l'identifiant unique de mes cellules dans IB (même si je n'en ai pas besoin pour la mise en file d'attente car il s'agit d'une table statique) et en le vérifiant. Ainsi, si je déplace ma cellule vers le haut ou vers le bas dans la table statique, je n'aurai pas besoin de changer 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'envoie la cellule avec la légende - la division normale de la cellule le fait, et je l'avais initialement passée à zéro, et mon code qui en dépendait a cessé de fonctionner.

33
Rhubarb

Ceci est une vieille question et quelques grandes réponses correctes mais je posterai quelques informations supplémentaires que je me sentais utiles quand j'ai rencontré ceci:

  1. Si vous créez une séquence dans le storyboard en ctl + glissez de SomeVC vers AnotherVC, supprimez-le. 

  2. Dans le navigateur d'objet, faites glisser ctl + au niveau de ViewController (généralement le premier dans la hiérarchie sous le nom du VC) de SomeVC à AnotherVC. Donnez à la segue un identifiant unique.

  3. Implémentez tableView: didSelectRowAtIndexPath: comme décrit ci-dessus.

  4. J'ai trouvé utile d'utiliser une instruction switch dans tableView: didSelectRowAtIndexPath:

    switch (indexPath.row) {
    case 0:
        [self performSegueWithIdentifier:@"yourIDHere" sender:self];
        break;
    case 1:
        // enter conditional code here...
        break;
    case 2:
        // enter conditional code here...
        break;
    // ... for however many cells you require
    
    default:
        break;
    

    }

Merci pour les bonnes réponses tout le monde.

5
Chris Holloway

Vous pouvez facilement contrôler l’ouverture de toute séquence dans votre UIViewController personnalisé en implémentant:

override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool { return true // or false, depending on what you need }

0
vedrano