UITableView – IndexPath总是返回0,并且需要2次点击才能将正确的数据传递给视图控制器

我有一个UITableViewinheritance了ViewController 。 我的tableview包含位置名称列表,当您select一个位置时,它会将更详细的数据传递给视图控制器关于选定的位置。 我的问题是,我的索引path始终返回0在第一次点击/加载无论我点击哪一行。 我必须点击每一行两次传递正确的数据。

例如:我点击row2>返回row1的(0)数据。 然后再次单击row2>正确返回row2的数据>然后单击row3>返回row2的数据>我必须再次单击row3才能获取row3的数据。 在下面的代码中selectindexPathSelected始终为0

 NSInteger indexPathSelected; - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { indexPathSelected = indexPath.row; } #pragma mark - Navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"showLocationDetails"]) { LocationDetailsViewController *vc = [segue destinationViewController]; vc.location = _locationsArray [indexPathSelected]; } } 

问题是prepareForSegue在didSelectRowAtIndexPath之前被调用。 当使用segues时,通常不需要实现didSelectRowAtIndexPath。 prepareForSegue:sender:中的sender参数是您select的单元格,所以您可以从中获取索引path:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"showLocationDetails"]) { LocationDetailsViewController *vc = [segue destinationViewController]; indexPathSelected = [self.tableView indexPathForCell:sender].row; vc.location = _locationsArray[indexPathSelected]; } } 

prepareForSegue:sender:可能是在tableView:didSelectRowAtIndexPath:之前调用的,所以第一次加载是初始化indexPathSelected ,默认为0,然后每次传递前一个值。

我摆脱tableView:didSelectRowAtIndexPath:并改变prepareForSegue:sender:如下所示:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"showLocationDetails"]) { LocationDetailsViewController *vc = [segue destinationViewController]; NSIndexPath selectedIndexPath = [[self tableView] indexPathForSelectedRow]; vc.location = _locationsArray[[selectedIndexPath row]]; } } 

它应该完成你想要的同样的事情。