prepareForSegue 传递索引 0 的值...总是
Posted
技术标签:
【中文标题】prepareForSegue 传递索引 0 的值...总是【英文标题】:prepareForSegue passes value for Index 0...ALWAYS 【发布时间】:2015-03-10 16:22:58 【问题描述】:我在TableViewController
中显示了一组项目。它们在 TVC 中正确显示。下面的代码继续,但它只与我的MKMapItem
s 数组中的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 标签中的值为零)
PrepareForSegue 总是返回索引为 0 的单元格
通过 prepareForSegue 传递 NSString - Swift