如何在tableView中找到tapPath附件按钮的indexPath

时间:2012-12-03 19:10:20

标签: objective-c ios uitableview segue

我简单UITableView有一个部分和几行。当用户单击单元格附件按钮(与detailsSegue连接时。我想知道它是什么单元格行。所以我可以从我的数组中选择正确的对象并将其分配给下一个视图中的变量。

我使用了委托方法tableview:accessoryButtonTappedForRowWithIndexPath:并将indexPath值分配给了我的私有属性myRow。在prepareForSegue:sender:方法中,我使用self.myRow.row值从数组中选择正确的对象。

我的问题是这两种方法似乎执行顺序错误。从NSLog我可以看到prepareForSegue:sender:方法首先被执行,我的委托方法正在改变self.myRow之后的值。

所以prepareForSegue:sender:方法总是将错误的对象传递给下一个视图(之前被点击的视图)。

对不起我的英国人。提前感谢您的帮助。

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
    self.myRow = indexPath;
    NSLog(@"tapped button at row: %i",self.myRow.row); 
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"addSegue"]) {
        AddViewController *avc = segue.destinationViewController;
        avc.delegate = self;
    }
    else if ([segue.identifier isEqualToString:@"detailsSegue"]) {
        NSLog(@"Segue row: %i",self.myRow.row);
        Annotation *annotation = [self.viewsList objectAtIndex:self.myRow.row];
        NSLog(@"Segue annotation object: %@",annotation.title);
        DetailsViewController *dvc = segue.destinationViewController;
        dvc.wikiKey = annotation.title;
    }
}

4 个答案:

答案 0 :(得分:42)

正如您所发现的那样,系统会在向您发送prepareForSegue:sender:消息之前向您发送tableview:accessoryButtonTappedForRowWithIndexPath:消息

但是,当它向您发送prepareForSegue:sender:消息时,sender参数是包含附件视图的UITableViewCell。您可以使用它来确定点击了哪一行的附件按钮:

else if ([segue.identifier isEqualToString:@"detailsSegue"]) {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    Annotation *annotation = [self.viewsList objectAtIndex:indexPath.row];
    DetailsViewController *dvc = segue.destinationViewController;
    dvc.wikiKey = annotation.title;
}

答案 1 :(得分:2)

发件人将成为配件按钮,对吗?在这种情况下,您应该能够通过超级视图查找其包含的单元格,然后获取该单元格的索引路径。我之前使用过这样的方法来完成第一部分:

+ (UITableViewCell *)findParentCellOfView:(UIView *)view {
  if (view == nil || [view isKindOfClass:[UITableViewCell class]]) {
    return (UITableViewCell *)view;
  }
  return [self findParentCellOfView:[view superview]];
}

答案 2 :(得分:2)

//我告诉你一个简单,更好,更简单的选择: -

//解决方案: - 您可以在tableView

的这种方法中将标签分配给附件视图的按钮
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // set accessory view
    UIButton *oValidHomeAccessryBtn = [UIButton buttonWithType:UIButtonTypeCustom];

    // set target of accessory view button
    [oValidHomeAccessryBtn addTarget:self action:@selector(AccessoryAction:) forControlEvents:UIControlEventTouchUpInside];

    // set tag of accessory view button to the row of table
    oValidHomeAccessryBtn.tag =indexPath.row;

    // set button to accessory view
    cell.accessoryView = oValidHomeAccessryBtn ;
}

//制作你在选择器中传递的方法并获取标记值,然后点击附件视图的indexPath

- (void)AccessoryAction:(id)sender
{
    NSLog(@"%d",[sender tag]);
}

这是获取您点击附件视图的行的indexPat的最简单方法。

答案 3 :(得分:-3)

您需要做的是从委托方法以编程方式调用segue。假设您正在使用故事板,则需要取消链接故事板中segue和委托方法使用中的链接:

[self performSegueWithIdentifier: @"IdentifierNameHere" sender: self];