Use didSelectRowAtIndexPath or prepareForSegue method for UITableView? Use didSelectRowAtIndexPath or prepareForSegue method for UITableView? objective-c objective-c

Use didSelectRowAtIndexPath or prepareForSegue method for UITableView?


If you use prepareForSegue:sender:then you won't have as much to change if you later decide to trigger the segue from some control outside the table view.

The prepareForSegue:sender: message is sent to the current view controller, so I'd suggest something like this:

- (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];}

In Swift:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {    let path = self.tableView.indexPathForSelectedRow()!    segue.destinationViewController.detail = self.detailForIndexPath(path)}


I did this and it worked

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{    NSLog(@"Row Selected = %i",indexPath.row);    [self performSegueWithIdentifier:@"testID" sender:self.view];    }


When sender is UITableViewCell, you may ask UITableView to query indexPath of the cell.

    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        }    }