Tableview button get index.row

我是研究僧i 提交于 2019-12-11 04:39:20

问题


I got a button in a tableview cell (named "deleteTemplate"), and when it's pressed i should get the "index.row" for the cell the button is in. Anybody knows how to get the "index.row" for the cell, when you click a button in the cell?

My current code for the button:

UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
NSIndexPath *clickedButtonIndexPath = [self.tableView indexPathForCell:clickedCell];

NSDictionary *dic = [tableData objectAtIndex:clickedButtonIndexPath.row];

But clickedButtonIndexPath = NULL? :(

This worked in iOS 6.

Thank you!!!


回答1:


You are getting null because the view hierarchy in iOS 7 is changed.

I recommend to use Delegate for getting the indexpath of TableViewCell.

You can get the sample project from here

Here is the sample:

My View Controller looks like this:


//#import "ViewController.h"
//#import "MyCustomCell.h"
@interface ViewController () 
{
    IBOutlet UITableView *myTableView;
    NSMutableArray *dataSourceArray;
}
@end
@implementation ViewController
-(void)viewDidLoad
{
    [super viewDidLoad];
    dataSourceArray = [[NSMutableArray alloc] init];
    for(int i=0;i<20;i++)
        [dataSourceArray addObject:[NSString stringWithFormat:@"Dummy-%d",i]];
}
-(void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
//pragma mark - UITableView Delegate And Datasource -
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return dataSourceArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdenfifier = @"MyCustomCell";
    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdenfifier forIndexPath:indexPath];
    [cell setDelegate:self];
    [cell.myButton setTitle:[dataSourceArray objectAtIndex:indexPath.row] forState:UIControlStateNormal];
    return cell;
}
//pragma mark - MyCustomCell Delegate -
-(IBAction)myCustomCellButtonTapped:(UITableViewCell *)cell button:(UIButton *)sender
{
    NSIndexPath *indexPath = [myTableView indexPathForCell:cell];
    NSLog(@"indexpath: %@",indexPath);
}
@end

MyCustomCell.h looks like this:


//#import 
@protocol MyCustomCellDelegate 
@optional
- (IBAction)myCustomCellButtonTapped:(UITableViewCell *)cell button:(UIButton *)sender;
@end
@interface MyCustomCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@property(nonatomic, weak)id delegate;
@end

MyCustomCell.m looks like this:


//#import "MyCustomCell.h"
@implementation MyCustomCell
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
    }
    return self;
}
-(void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
}
//#pragma mark - My IBActions -
-(IBAction)myCustomCellButtonTapped:(UIButton *)sender
{
    if([self.delegate respondsToSelector:@selector(myCustomCellButtonTapped:button:)])
        [self.delegate myCustomCellButtonTapped:self button:sender];
}
@end



回答2:


you set tag for your button in cellforrowatindexpath

clickedButtonIndexPath.tag=indexpath.row;

when button is presse in action write

nslog(@"%i",btutton.tag);

if clickedbuttonindexpath is nil it wont uitableviewcell




回答3:


This question is already answered many times. For completion, here is the best solution:

    -(IBAction)cellButtonTapped:(UIButton *)sender
    {
        CGRect buttonFrame = [sender convertRect:sender.bounds toView:self.tableView];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonFrame.origin];
    }



回答4:


when you make the cell assign at you button.tag the indexPath.row and when you click the button in your method you have the sender (the button) and you get the indexPath from the sender's tag



来源:https://stackoverflow.com/questions/19892477/tableview-button-get-index-row

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!