web-dev-qa-db-fra.com

Comment créer une séquence Push lorsqu'un UITableViewCell est sélectionné

J'ai une liste d'effets dans une vue de tableau. J'ai créé un bouton de barre en haut à droite qui effectue une transition Push vers un autre contrôleur de vue, ce qui permet de créer un nouvel effet. Maintenant, je veux ajouter des séquences Push aux cellules de la vue tableau afin que les valeurs des effets puissent être chargées sur le contrôleur de la vue d'ajout d'effets et que je puisse enregistrer les valeurs modifiées.

La question est: puis-je créer une séquence Push par programmation? Sinon, puis-je passer l'effet à travers un prepareforsegue? Si j'essaie d'utiliser prepareforsegue, je rencontre un problème où le contrôle en glissant depuis UITableView ne me permet pas de créer une séquence Push dans le contrôleur de vue d'ajout d'effets.

59
Aviral Bajpai

control glisser de contrôleur de vue à contrôleur de vue

From View Controller to View Controlle!

Vous devrez donner un identifiant à votre séquence:

enter image description here

Effectuer la segue:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"yourSegue" sender:self];
}

Maintenant, voici la chose, cela va simplement effectuer la transition, si jamais vous aviez besoin de transmettre des données à ce contrôleur de vue. Ensuite, vous devez implémenter le délégué de segue suivant:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"yourSegue"])
    {
        //if you need to pass data to the next controller do it here
    }
}
175
meda

Swift

Cette réponse montre comment transmettre des données et est mise à jour pour Xcode 8 et Swift 3.

Voici comment mettre en place le projet.

  • Créez un projet avec un TableView. Voir ici pour un exemple simple.
  • Ajoutez une seconde ViewController.
  • Contrôlez le glissement du premier contrôleur de vue avec la vue tableau vers le second contrôleur de vue. Choisissez "Afficher" comme type de séquence.

enter image description here

  • Cliquez sur la séquence dans le storyboard, puis dans l'inspecteur d'attributs, nommez l'identifiant "yourSegue". (Vous pouvez l'appeler comme vous voulez, mais vous devez également utiliser le même nom dans le code.)

enter image description here

  • (Facultatif) Vous pouvez tout incorporer dans un contrôleur de navigation en sélectionnant le premier contrôleur de vue dans le story-board et en accédant à Éditeur> Incorporer dans> Contrôleur de navigation . .

Code

Premier contrôleur de vue avec TableView:

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    // ...


    // method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        // Segue to the second view controller
        self.performSegue(withIdentifier: "yourSegue", sender: self)
    }

    // This function is called before the segue
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // get a reference to the second view controller
        let secondViewController = segue.destination as! SecondViewController

        // set a variable in the second view controller with the data to pass
        secondViewController.receivedData = "hello"
    }
}

Deuxième contrôleur de vue

class SecondViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

    // This variable will hold the data being passed from the First View Controller
    var receivedData = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        print(receivedData)
    }
}

Pour un exemple plus élémentaire sur la transmission de données entre contrôleurs de vue, voir cette réponse .

47
Suragch

Voici une autre option, qui n'exige pas l'utilisation de didSelectRowAtIndexPath.

Vous venez de câbler la séquence dans Interface Builder de la cellule prototype à la destination.

A partir de là, vous pouvez simplement:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "AffiliationDetail", let destination = segue.destinationViewController as? AffiliateDetailViewController {
        if let cell = sender as? UITableViewCell, let indexPath = tableView.indexPathForCell(cell) {
            var affiliation = affiliations[indexPath.row]
            destination.affiliation = affiliation
        }
    }
}
46
skwashua
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"YourPushSegueName" sender:self];
}
13
Mayank Jain
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyViewController *myVController = (MyViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"StoryBordIdentifier"];
    [self.navigationController pushViewController:myVController animated:YES];
}
5
Vineesh TP

Vous avez 2 options: ctrl + glisser de la cellule prototype à la nouvelle vc, puis vous séparerez de chaque cellule et vous devrez mettre en œuvre la préparation à la transition.

Deuxième option, dans didselectrowatindexpath, vous pouvez instancier votre nouveau contrôleur de vue à l’aide de self.storyboard, installez un contrôleur de vue avec un identifiant ..., puis appelez pushviewcontroller ou presentviewcontroller.

3
Calin Chitu

Vous pouvez utiliser cette méthode:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Vous pouvez effectuer une fonction lors de la sélection d'une cellule particulière de la table.

2
PunjabiCoder

Swift

Après avoir suivi la réponse d’Ahmed Daou -> faites glisser manuellement la séquence de vc à vc au storyboard

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    self.performSegue(withIdentifier: "SegueIdentifier", sender: nil)    
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "SegueIdentifier" {
        //do something you want
    }
}
0
yonlau
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {

    [self performSegueWithIdentifier:@"segueIdentifier" sender:indexPath];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"segueIdentifier"]) {
        NSIndexPath *indexPath = (NSIndexPath *)sender;

    }
}
0
Jarvan

Vous pouvez le faire en utilisant les méthodes suivantes:

Tout d'abord, vous devez importer un autre contrôleur de vue dans la vue actuelle.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {}

dans la méthode ci-dessus, vous devez appeler une méthode - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; comme ceci:

yourViewController = [[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil];
[self.navigationController YourViewController animated:YES];

De cette manière, vous pouvez atteindre le segment Push lorsque UITableViewCell est sélectionné.

J'espère que cela peut vous aider…!

0
Bhanu