从 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 获取单元格索引

将图像从 tableViewcell(Xib 文件)传递给另一个 ViewController

从 TableViewCell 上的 UITextField 获取文本

IOS swift我可以从TableViewCell中获取当前可见视图吗