J'utilise des storyboards et j'ai un UITableView. J'ai une configuration de division qui pousse de ma table au détail VC. Mais quelle méthode dois-je utiliser pour gérer cela? Je vais devoir passer quelques objets à la vue détaillée. Mais est-ce que j'utilise didSelectRowAtIndex
ou -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
?
Si vous utilisez prepareForSegue:sender:
then, vous n'aurez plus autant à changer si vous décidez ultérieurement de déclencher la transition à partir d'un contrôle situé en dehors de la vue Table.
Le message prepareForSegue:sender:
est envoyé au contrôleur de vue actuel, je suggérerais donc quelque chose comme ceci:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Assume self.view is the table view
NSIndexPath *path = [self.tableView indexPathForSelectedRow];
DetailObject *detail = [self detailForIndexPath:path];
[segue.destinationViewController setDetail:detail];
}
En rapide:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let path = self.tableView.indexPathForSelectedRow()!
segue.destinationViewController.detail = self.detailForIndexPath(path)
}
Je l'ai fait et ça a marché
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"Row Selected = %i",indexPath.row);
[self performSegueWithIdentifier:@"testID" sender:self.view];
}
Lorsque l'expéditeur est UITableViewCell, vous pouvez demander à UITableView d'interroger indexPath de la cellule.
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let cell = sender as? UITableViewCell {
let indexPath = self.tableView.indexPathForCell(cell)!
assert(segue.destinationViewController.isKindOfClass(DetailViewController))
let detailViewController = segue.destinationViewController as! DetailViewController
detailViewController.item = self.items[indexPath.row] // like this
}
}
Si la cellule d'expéditeur n'est pas sélectionnable, self.tableView.indexPathForSelectedRow
renvoie la cellule sélectionnée, mais ne sépare pas la cellule d'expéditeur. Le meilleur moyen est d'obtenir indexPath pour l'expéditeur de la séquence:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
((MyViewController *)[segue destinationViewController]).senderIndexPath = [self.tableView indexPathForCell:sender];
}
En rapide:
override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
(segue.destinationController as! MyViewController).senderIndexPath = self.tableView.indexPathForCell(sender)
}
si votre propriété tableView est dans une autre classe et que vous n'avez qu'une seule section, vous pouvez utiliser la propriété tag
pour stocker la ligne de la cellule comme suit:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
cell.tag = indexPath.row;
return cell;
}
Et vous pourrez alors y accéder car la sender
est la même cellule avec la valeur de la ligne dans sa balise:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
MyDestinationViewController *destinationViewController = segue.destinationViewController;
destinationViewController.myProperty = [tableViewElementsArray objectAtIndex:[sender tag]]; // sender will be your cell
}
Si vous utilisez prepareForSegue:
, vous pouvez vérifier qui est l'expéditeur et exécuter un code différent.
Par exemple, dans Swift
override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?)
{
var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell)
if senderIsTableviewCell
{
//do something
}
}