如何通过触摸按钮获取indexPath?

时间:2012-10-22 15:24:25

标签: ios xcode uitableview

我有动态tableView和一个问题。在每个tableCell中有两个按钮。 我试图让按钮触及indexPath.row,但没有成功。

我的代码:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    NSIndexPath *indexPath = [self.homeTableView indexPathForSelectedRow];      

    NSLog(@"%d", indexPath.row);


}

我怎样才能获得indexPath.row for touced按钮(Segue连接通过这两个按钮 - >两个连接)?

6 个答案:

答案 0 :(得分:10)

它不起作用,因为单击按钮时没有选择行。

使用两个按钮,我会断开你的segue与按钮,并在IB中做2个手动segue,然后添加这样的代码来处理它们:

-(void)button1Pressed:(id)sender {
    UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
    NSIndexPath *clickedButtonIndexPath = [self.homeTableView indexPathForCell:clickedCell];
    ...
    [self performSegueWithIdentifier:@"YourManualSegueIdentifier1" sender:self];
}

编辑第二个选项:

在MyTableViewCell.h中:

@interface MyTableViewCell : UITableViewCell
    ...    
    @property (strong, nonatomic) NSIndexPath *cellIndexPath;
    ...
@end

在MyTableViewCell.m中:

-(void)button1Pressed:(id)sender {
    ...
    NSInteger row = cellIndexPath.row;
    ...
}

在MyTableViewController.m中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];      
    }
    // remember index here!
    [cell setCellIndexPath:indexPath];
    ....
    return cell;
}

答案 1 :(得分:10)

Apple更改了iOS 7中的UITableViewCell层次结构

使用iOS 6.1 SDK

<UITableViewCell>
   | <UITableViewCellContentView>
   |    | <UILabel>

使用iOS 7 SDK

<UITableViewCell>
   | <UITableViewCellScrollView>
   |    | <UITableViewCellContentView>
   |    |    | <UILabel>

因此,如果您想在按钮索引处获取indexpath,请使用以下代码 使用iOS 6或更高版本的SDK

UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
    NSIndexPath *clickedButtonPath = [book_table indexPathForCell:clickedCell];
    NSLog(@"index=%@",clickedButtonPath);

使用iOS 7或7+ SDK

 UITableViewCell *clickedCell = (UITableViewCell *)[[[sender superview] superview]superview];
    NSIndexPath *clickedButtonPath = [book_table indexPathForCell:clickedCell];
    NSLog(@"index=%ld",(long)clickedButtonPath.item);

答案 2 :(得分:6)

我没有使用故事板但是一旦我在简单的基于viewconroller的项目中做到了,我认为这可能对你有所帮助。

 - (IBAction)goToNew:(id)sender 
{
   UIButton *btn = (UIButton*) sender;
   UITableViewCell *cell = (UITableViewCell*) [btn superview];
   NSIndexPath *indexPath = [tableView indexPathForCell:cell]; 
   int row = indexPath.row;
}

答案 3 :(得分:1)

可能触摸UIButton而不是UITableView / UITableViewCell。

检查:

NSLog(@"%@",[sender class]);

答案 4 :(得分:0)

解决了button.tag

在“cellForRowAtIndexPath”中我设置了button.tag = indexPath.row然后在“ - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {“

UIButton *btn = (UIButton*) sender;
NSLog(@"%d", btn.tag);

答案 5 :(得分:0)

按钮tag = indexpath.row+100;

并获得..

-(IBAction)ShowListView:(id)sender
{

    UIButton *btn = (UIButton *)sender;

    int Iindex = btn.tag-100;

    NSLog(@"button title is %@",btn.titleLabel.text);
    NSLog(@"button id is %d",Iindex);

    NSLog(@"array category is....%@",arrayCategory);