Tableview 按钮获取 index.row

Posted

技术标签:

【中文标题】Tableview 按钮获取 index.row【英文标题】:Tableview button get index.row 【发布时间】:2013-11-10 17:05:55 【问题描述】:

我在表格视图单元格中有一个按钮(名为“deleteTemplate”),当按下它时,我应该获得按钮所在单元格的“index.row”。任何人都知道如何获得“index.row”对于单元格,当您单击单元格中的按钮时?

我当前的按钮代码:

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

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

但是 clickedButtonIndexPath = NULL? :(

这在 ios 6 中有效。

谢谢!!!

【问题讨论】:

这叫什么名字? indexPathForCell returns nil since ios7的可能重复 你试过了吗***.com/questions/18751658/… 【参考方案1】:

由于 iOS 7 中的视图层次结构发生了变化,您将得到 null。

我推荐使用 Delegate 来获取 TableViewCell 的 indexpath。

You can get the sample project from here

示例如下:

我的视图控制器如下所示:


//#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 如下所示:


//#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 如下所示:


//#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】:

你在cellforrowatindexpath中为你的按钮设置标签

clickedButtonIndexPath.tag=indexpath.row;

当按钮被按下时写入

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

如果 clickedbuttonindexpath 为 nil,它不会 uitableviewcell

【讨论】:

问题是为什么clickedIndexPath 会以nil 的形式返回。这与设置按钮的标签无关。此外,将按钮的标签设置为indexPath.row 并不是最好的解决方案,因为行可以添加、删除或重新排序。 能否请您在 nslog 中打印 clickedCell 。我认为它不会是 uitableviewcell 它将被查看【参考方案3】:

这个问题已经回答了很多次了。为了完成,这是最好的解决方案:

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

【讨论】:

【参考方案4】:

当您将单元格分配给您button.tag indexPath.row 并且当您单击方法中的按钮时,您将拥有发送者(按钮)并从发送者的标签中获得 indexPath

【讨论】:

这不能回答问题。如果可以添加、删除或重新排序行,则此解决方案不起作用。

以上是关于Tableview 按钮获取 index.row的主要内容,如果未能解决你的问题,请参考以下文章

iOS - TableView - 在点击按钮上获取标题部分的索引

iOS如何从tableview单元格中获取按钮文本

如何从单元格中的按钮操作获取 tableview 中的 indexPath?

如何通过单击 tableview 单元格上的按钮获取文档 ID?

如何在 tableview 中获取 youtube 嵌入视频并在处理“完成”按钮时遇到问题

IOS swift如何在标签点击时在TableView中获取标签文本