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 - 在点击按钮上获取标题部分的索引
如何从单元格中的按钮操作获取 tableview 中的 indexPath?
如何通过单击 tableview 单元格上的按钮获取文档 ID?