prepareForSegue 传递索引 0 的值...总是

Posted

技术标签:

【中文标题】prepareForSegue 传递索引 0 的值...总是【英文标题】:prepareForSegue passes value for Index 0...ALWAYS 【发布时间】:2015-03-10 16:22:58 【问题描述】:

我在TableViewController 中显示了一组项目。它们在 TVC 中正确显示。下面的代码继续,但它只与我的MKMapItems 数组中的indexPath 0 相关,而不是被单击的单元格中的项目。

对我的错误在哪里有什么想法吗?

@property (strong, nonatomic) NSArray *mapItems;

每个单元格都有一个“添加 POI”UIButton,它会触发使用 Interface Builder 创建的名为“addPOISegue”的 segue。

这是“添加 POI”按钮的 IBAction:

- (IBAction)addPOIButtonClicked:(UIButton *)sender 
    NSLog(@"Add POI button clicked");
    [self performSegueWithIdentifier:@"addPOISegue" sender:sender];

这是`prepareForSegue

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UIButton*)sender 

//    NSLog(@"The sender is %@", sender);
    if ([[segue identifier] isEqualToString:@"addPOISegue"]) 
        AddPOIViewController *destinationVC = segue.destinationViewController;

        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:sender.center];
        NSLog(@"NSIndexPath *indexPath's index is %@", indexPath);
        MKMapItem *item = _mapItems[indexPath.row];
//        NSLog(@"ResultsTVC item is %@", item);
        destinationVC.item = item;
    


indexPath 一直设置为 0。我怀疑这是因为我有一个按钮触发单元格内的 segue,但我不知道如何解决这个问题。

【问题讨论】:

你是直接从按钮做的segue吗?如果是这样,您不应该调用 performSegue。 如何设置destinationViewController 的属性?我试着摆弄它,但我无法设置它的属性。 你在 prepareForSegue 中这样做,就像你已经做到的那样。请在此处查看我的答案 (***.com/questions/28818617/…),了解如何获取 indexPath 您查看我提供的链接了吗?当您单击按钮时,单元格未被选中,因此 indexPathForSelectedRow 将为 nil。您需要使用 indexPathForRowAtPoint: 并将按钮的中心传递给 point 参数(发送者将是 prepareForSegue:sender 中的按钮)。 就像我在链接中显示的那样。将 prepareForSegue:Sender: 中的 sender 参数更改为“(UIButton *) sender”而不是“id”,然后将 sender.center 作为 point 参数传递。 【参考方案1】:

您应该删除按钮的操作方法,并将 segue 直接从按钮连接到下一个控制器。在prepareForSegue中,可以传递按钮的原点,将其转换为table view的坐标系后,再传给indexPathForRowAtPoint:方法,获取该按钮所在单元格的indexPath,

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UIButton*)sender 

    if ([[segue identifier] isEqualToString:@"addPOISegue"]) 
        AddPOIViewController *destinationVC = segue.destinationViewController;
        CGPoint p = [sender convertPoint:CGPointZero toView:self.tableView];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
        NSLog(@"NSIndexPath *indexPath's index is %@", indexPath);
        MKMapItem *item = _mapItems[indexPath.row];
//        NSLog(@"ResultsTVC item is %@", item);
        destinationVC.item = item;
    


【讨论】:

非常感谢!非常感谢您在这个基本问题上提供的最重要的帮助。【参考方案2】:

@rdelmar 想通了。由于单元格中包含UIButton 并在我的prepareForSegue 方法中引用,我需要CGPoint

这段代码让它工作了:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UIButton*)sender 

//    NSLog(@"The sender is %@", sender);
    if ([[segue identifier] isEqualToString:@"addPOISegue"]) 
        AddPOIViewController *destinationVC = segue.destinationViewController;

        CGPoint point = [sender convertPoint:CGPointZero toView:self.tableView];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:point];
        NSLog(@"NSIndexPath *indexPath's index is %@", indexPath);
        MKMapItem *item = _mapItems[indexPath.row];
        NSLog(@"ResultsTVC item is %@", item);
        destinationVC.item = item;
    


【讨论】:

以上是关于prepareForSegue 传递索引 0 的值...总是的主要内容,如果未能解决你的问题,请参考以下文章

Swift - PrepareForSegue 无法传递 sender.tag(其他 ViewController 标签中的值为零)

Segue 不传递正确的行的索引路径总是第 0 节

PrepareForSegue 总是返回索引为 0 的单元格

通过 prepareForSegue 传递 NSString - Swift

在 Swift 2 中通过“prepareForSegue”传递数据

将变量从 tableView 传递给 prepareForSegue?