是使用tableView:willSelectedRowAtIndexPath:正确的方式传递变量?

时间:2014-10-27 12:32:16

标签: ios objective-c uitableview segue

你好我试图用segue传递变量。

我要使用tableView传递变量:willSelectedRowAtIndexPath:这是正确的方法吗?如果不是,我该怎么做呢? (注意:它的工作方式如下。)

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    selectedCoffeeShop = [coffeeShops objectAtIndex:indexPath.row];
    return indexPath;
}


-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"coffeeShopDetailSegue"]) {
        CoffeeShopDetailViewController *controller = (CoffeeShopDetailViewController *)segue.destinationViewController;
        [segue destinationViewController];
        controller.coffeeShop = selectedCoffeeShop;
    }
}

2 个答案:

答案 0 :(得分:1)

这样做的方式绝对没问题。

另一种方法是从故事板中删除自动segue触发器,而不是实现: tableView:didSelectRowAtIndexPath:致电performSegueWithIdentifier:sender:

看起来像这样:

- (NSIndexPath *)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   selectedCoffeeShop = [coffeeShops objectAtIndex:indexPath.row];
   [self performSegueWithIdentifier:@"coffeeShopDetailSegue" sender:self];
   return indexPath;
 }

在这种情况下,您仍需要实施prepareForSegue:sender:

你也可以使用UINavigationController在没有segue的情况下完成它,但是你必须以编程方式实例化CoffeeShopDetailViewController

你的方法完全没问题!

如评论中所述,您可以删除[segue destinationViewController];,因为这会返回您已保存在上方右侧变量controller中的目标视图控制器。 :)

答案 1 :(得分:1)

如果你的segue是由单元格本身构成的,那么就不需要实现willSelectRowAtIndexPath或didSelectRowAtIndexPath。您只需要prepareForSegue:sender:因为sender参数将是单元格,您可以使用它来获取所需的indexPath,

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UITableViewCell *)sender {
    if ([segue.identifier isEqualToString:@"coffeeShopDetailSegue"]) {
        NSInteger row = [self.tableView indexPathForCell:sender].row;
        CoffeeShopDetailViewController *controller = segue.destinationViewController;
        controller.coffeeShop = coffeeShops[row];
    }
}