为UITableView使用didSelectRowAtIndexPath或prepareForSegue方法?

我正在使用故事板,我有一个UITableView。 我有一个segue设置,从我的表推到细节VC。 但是,我应该使用哪种方法来处理这个问题? 我将不得不将几个对象传递给详细视图。 但是,我使用didSelectRowAtIndex-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

如果你使用prepareForSegue:sender:那么你将不会有太多的改变,如果你以后决定从表视图之外的一些控制触发segue。

prepareForSegue:sender:消息被发送到当前的视图控制器,所以我build议这样的事情:

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

在Swift中:

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

我做到了这一点,它的工作

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

当发件人是UITableViewCell时,你可以要求UITableView查询单元格的indexPath。

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

如果你的tableView属性在另一个类中,而你只有一个部分 ,那么你可以使用tag属性来存储单元格的行:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; cell.tag = indexPath.row; return cell; } 

然后你可以访问它,因为sender是与其标签中的行值相同的单元格:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { MyDestinationViewController *destinationViewController = segue.destinationViewController; destinationViewController.myProperty = [tableViewElementsArray objectAtIndex:[sender tag]]; // sender will be your cell } 

如果发件人单元格不可选, self.tableView.indexPathForSelectedRow返回所选单元格,但不会延续发件人单元格。 最好的方法是获得segue发件人的indexPath:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { ((MyViewController *)[segue destinationViewController]).senderIndexPath = [self.tableView indexPathForCell:sender]; } 

在Swift中:

 override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) { (segue.destinationController as! MyViewController).senderIndexPath = self.tableView.indexPathForCell(sender) } 

如果您使用prepareForSegue:您可以检查发件人是谁,并执行不同的代码

例如在迅速

 override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?) { var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell) if senderIsTableviewCell { //do something } }