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.
control glisser de contrôleur de vue à contrôleur de vue
Vous devrez donner un identifiant à votre séquence:
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
}
}
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.
TableView
. Voir ici pour un exemple simple.ViewController
.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 .
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
}
}
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"YourPushSegueName" sender:self];
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
MyViewController *myVController = (MyViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"StoryBordIdentifier"];
[self.navigationController pushViewController:myVController animated:YES];
}
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.
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.
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
}
}
- (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;
}
}
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…!