11

在下面的代码中,我只是尝试直接UIViewControllerDetailViewController. 我通常从UITableViewCell(我认为更清楚)做segue,但这次我只是想尝试直接从ViewControllerusing-tableView:didSelectRowAtIndexPath:

我的问题是:我遇到了需要UITableViewCell indexPath-prepareForSegue:sender:我的解决方案中访问的情况是发送indexPathvia sender。通常我会将 sender 设置在self这里,我环顾四周,找不到任何参考,我只是好奇使用 sender 传递 indexPath 是否可以接受?我很确定是这样,而且我确信我以前在某个地方读过你可以,但我现在找不到任何参考。

// ------------------------------------------------------------------- **
// DELEGATE: UITableView
// ------------------------------------------------------------------- **
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    [self performSegueWithIdentifier:@"SEGUE_TWO" sender:indexPath];
}

// ------------------------------------------------------------------- **
// SEGUE: ViewController_ONE > DetailViewController
// ------------------------------------------------------------------- **
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    if([[segue identifier] isEqualToString:@"SEGUE_TWO"]) {
        NSUInteger cellRow = [(NSIndexPath *)sender row];
        DetailViewController *destinationController = [segue destinationViewController];
        [destinationController setDataString:[[self dataList] objectAtIndex:cellRow]];
    }
}

编辑:在这种情况下我正在寻找的是

NSIndexPath *indexPath = [[self tableView] indexPathForSelectedRow]; 

本质上是一种无需通过 sender 参数 (in )即可indexPath进入的方式-performForSegue:sender:-performSegueWithIdentifier:sender:

4

2 回答 2

30

我通常避免使用 sender inprepareForSegue:因为它可能是任何东西。这使得断言您的发件人是您所期望的更加麻烦和脆弱。此外,我更喜欢检查destinationViewController 对象的类而不是segue 名称。您的功能与您的对象(或更具体地说是它的接口)相关联,而不是与您的 segue 的标题相关联,因此检查您的类可以清楚地了解您要完成的工作。

下面是我在生产中从UITableView. 请注意,您应该始终检查destinationViewController 是否嵌入在导航控制器中,然后还要检查对象的类以确保正确处理它。最后,使用断言来确保您没有添加一些您忘记处理的新 segue。

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // unwrap the controller if it's embedded in the nav controller.
    UIViewController *controller;
    UIViewController *destVC = segue.destinationViewController;
    if ([destVC isKindOfClass:[UINavigationController class]]) 
    {
        UINavigationController *navController = (UINavigationController *)destVC;
        controller = [navController.viewControllers firstObject];
    } 
    else 
    {
        controller = destVC;
    }

    if ([controller isKindOfClass:[DetailViewController class]]) 
    {
        DetailViewController *vc = (DetailViewController *)controller;
        NSIndexPath *ip = [self.tableView indexPathForSelectedRow];
        [vc setDataString:[[self dataList] objectAtIndex:ip.row]];

    } 
    else 
    {
        NSAssert(NO, @"Unknown segue. All segues must be handled.");
    }

}
于 2013-03-14T16:06:38.873 回答
10

你可以使用 UITableView 的方法indexPathForCell。我希望你有一个 tableView 实例变量。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([sender isKindOfClass:[UITableViewCell class]]) {
        NSIndexPath * indexPath = [self.tableView indexPathForCell:sender];
        //Your code here
    }
}
于 2013-03-14T16:08:15.330 回答