从 tableViewCell 类中获取 indexPath [重复]
Posted
技术标签:
【中文标题】从 tableViewCell 类中获取 indexPath [重复]【英文标题】:Get indexPath from tableViewCell class [duplicate] 【发布时间】:2014-03-16 15:01:01 【问题描述】:我有一个按钮(操作)连接到我的 UITableViewCell 类。如何从 tableViewCell 类中获取 tableView 的 indexPath?
@implement myTableViewCell
-(IBAction)buttonPressed
// Do something to get indexPath?
【问题讨论】:
我希望从 UITableViewCell 类中获取 indexPath,而不是从 UITableView 类中获取。 最简单的解决方案是为您的自定义单元格添加索引属性并不断更新。 我可能弄错了,但我认为这个***.com/a/19441029/1187415 对“可能重复”的回答即使在表格视图单元格中也应该有效。 @MartinR 我刚看到,第一行出现错误“UIView *parentCell = sender.superview;”错误消息是“__strong id”类型的对象上找不到属性“superview”。这是什么意思? @user3322987:将方法声明为-(void)button1Tapped:(UIButton *)sender
应该可以解决这个问题。
【参考方案1】:
在 CustomCell.h 中
@property (nonatomic, strong) UIButton *btn;
在tableView数据源文件中
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
[cell.btn addTarget:self action:@selector(buttonPressed:event:) forControlEvents:UIControlEventTouchUpInside];
//button action
-(void)buttonPressed:(UIControl *)sender event:(id)event
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchPos = [touch locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:touchPos];
if(indexPath != nil)
//to do with indexPath
//单元格类中的按钮操作
- (void)buttonPressed:(UIButton *)btn event:(id)event
UIView *superView = [btn superview];
while (superView && ![superView isKindOfClass:[UITableView class]])
superView = [superView superview];
if ([superView isKindOfClass:[UITableView class]])
UITableView *tableView = (UITableView *)superView;
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchPos = [touch locationInView:tableView];
NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:touchPos];
if(indexPath != nil)
NSLog(@"tableView.row:%d", indexPath.row);
【讨论】:
我的 IBAction 在 Cell 类中。只想想办法从单元类中获取父级的tableView indexPath。 @user3322987 我已经编辑了我的代码。这对我来说很好。 cell只是一个视图,会被tableView重用,忽略tableView实际使用它时不能有任何indexPath信息。 你的回答很好,但我的问题还没有解决。无论如何,谢谢! 如果你真的想在单元格类中这样做,只需使用[btn superview]
递归找到tableView类,然后使用我的方法获取indexPath,我已经编辑了我的答案,希望对你有所帮助.【参考方案2】:
喜欢这个answer:
CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
【讨论】:
IBAction 在 UITableViewCell.m 中,如何指向父 tableView? 向您的TableViewCell
添加一个委托协议,它应该告诉您的tableView,它已被推送。
我的意思是我应该从下面的代码中对“self.tableView”进行什么投射? CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
你只需要知道tableViewCell
里面的索引路径吗?然后你可以在你的tableViewCell
添加一个indexPath
属性并从你的tableView
设置它。然后你就会知道,什么时候调用这个动作。
只想想办法从单元类本身获取父级的tableView indexPath。【参考方案3】:
使用发送者向您的按钮添加操作:
[btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
然后:
- (void) buttonPressed:(id)sender
CGPoint hitPoint = [sender convertPoint:CGPointZero toView:tableView];
NSIndexPath *hitIndex = [tableView indexPathForRowAtPoint:hitPoint];
【讨论】:
IBAction 在 UITableViewCell.m 中,如何指向父 tableView?【参考方案4】:从单元格中获取表格。把它放在单元格内
- (UITableView*)tableView
if (tableView == nil)
tableView = (UITableView*)self.superview;
while (tableView && ![tableView isKindOfClass:[UITableView class]])
tableView = (UITableView*)tableView.superview;
return tableView;
在您的 IBAction 中请求索引路径
NSIndexPath *p = [self.tableView indexPathForCell:self];
TADA ;)
【讨论】:
我想知道如何获取单元格的超级视图。 如何“从单元格中获取表格”? 我不明白你的问题.. 100% 下面的代码是什么以上是关于从 tableViewCell 类中获取 indexPath [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 TableViewCell 类中的 TextField 委托方法上获取单元格索引
我的 TableViewCell 自定义类中的 IbOutlet 从未被初始化
将图像从 tableViewcell(Xib 文件)传递给另一个 ViewController