如果单元格有按钮,我们怎样才能获得单元格的行和节

时间:2013-11-16 08:54:51

标签: ios uitableview

我已经摸索了表视图,每个部分我有两行,我有多个按钮 假设我在第一个单元格按钮中单击了第0部分,我怎样才能获得该单元格的no no和row no。

这是我的cellforrow,我正在排除但是如何查找部分没有??

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        [[cell contentView] setBackgroundColor:[UIColor clearColor]];
        [[cell backgroundView] setBackgroundColor:[UIColor clearColor]];
         [cell.Mybutton addTarget:self action:@selector(btnCommentClick:) forControlEvents:UIControlEventTouchUpInside];
    }
     cell.Mybutton.tag=indexPath.row;
}

-(void)btnCommentClick:(id)sender
{
        UIButton *senderButton = (UIButton *)sender;  
        NSLog(@"current Row=%d",senderButton.tag);
        NSIndexPath *path = [NSIndexPath indexPathForRow:senderButton.tag inSection:0];
}

4 个答案:

答案 0 :(得分:1)

试试这个:

- (void) btnCommentClick:(id)sender
{
    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
    if (indexPath != nil)
    {
     ...
    }
}

您可以使用indexPath.section

中的部分

答案 1 :(得分:1)

正确处理此问题的一种方法如下。注:如果您认为这是一项额外且不必要的工作,那么您要么非常懒惰,又要非常糟糕的设计,否则您无法获得如何设置流畅设计的OO代码。

  • 创建自定义UITableViewCell子类
  • 将按钮的目标设置为单元格
  • 在子类UITableVIewCell的.h文件中,在tableViewCell上创建符合该协议的协议和弱属性,例如:

    @class MyTableViewCell
    
    @protocol MyTableViewCellDelegate
    - (void) leftButtonTappedOnTableViewCell: (MyTableViewCell *) cell;
    - (void) rightButtonTappedOnTableViewCell: (MyTableViewCell *) cell;
    @end
    
    @interface MyTableViewCell: UITableViewCell
    @property (nonatomic, weak) id< MyTableViewCellDelegate> delegate; 
    @end
    
  • 确保tableViewCell中响应按钮调用的选择器在单元格的委托属性上调用其中一个委托方法。

  • 回到viewController的cellForRowAtIndexPath,你应该确保使用你的UITableVIewCell子类,并将委托设置为UIViewController。然后,实现两个委托方法,您可以通过询问tableVIew来获取单元格的indexPath:

    - (void) rightButtonTappedOnTableViewCell: (MyTableViewCell *) cell{
         NSIndexPath * indexPath = [self.tableView indexPathForCell: cell];
        // ... do something now that you now the indexPath
    }    
    

答案 2 :(得分:0)

tableViewCell是视图层次结构中的某个超级视图。您可以遍历超级视图以查找tableViewCell。

- (UITableViewCell *)cellForButton:(UIView *)button {
    if ([button.superview isKindOfClass:[UITableViewCell class]])
        return button.superview; // Return found cell
    else if (button.superview)
        return [self cellForButton:button.superview]; // Find next superview
    else
        return nil; // No cell found
}

找到后,您可以通过以下方式获取indexPath:

UITableViewCell *cell = [self cellForButton:yourButton];
IndexPath *indexPath = [tableView indexPathForCell:cell];

答案 3 :(得分:-1)

您可以尝试为单元格和其他属性(例如accessibilityIdentifier)提供标记值,如下所示。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    [[cell contentView] setBackgroundColor:[UIColor clearColor]];
    [[cell backgroundView] setBackgroundColor:[UIColor clearColor]];
     cell.Mybutton.tag = indexPath.row;
     cell.Mybutton.accessibilityIdentifier = [NSString stringWithFormat:@"%d",indexPath.section];
     [cell.Mybutton addTarget:self action:@selector(btnCommentClick:) forControlEvents:UIControlEventTouchUpInside];
       }

}

-(void)btnCommentClick:(id)sender
{
    UIButton *senderButton = (UIButton *)sender;  
    NSLog(@"current Row=%d current section =%d",senderButton.tag,[senderButton.accessibilityIdentifier intValue]);

}