你好我试图用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;
}
}
答案 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];
}
}