UITableView selected indexpath 值给错

UITableView selected indexpath value gives wrong

团队,

我有 UITableView,其中包含 50 多个单元格。 每个单元格的宽度为 60.

当我滚动到 20 个单元格时,然后点击任意单元格

它给出单元格值上方的索引路径值而不是单击单元格值

CellForRowAtIndexPath 内部

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    [[cell checkButton] addTarget:self action:@selector(checkButtonAction:) forControlEvents:UIControlEventTouchUpInside];

}

   -(void)checkButtonAction:(id)sender

    CGPoint touchPoint = [sender convertPoint:CGPointZero toView:self.tableview];

    NSIndexPath *indexPath = [self.tableview indexPathForRowAtPoint:touchPoint];

    UIButton *button = (UIButton *)sender;

 }

如果选择的索引是 21,则给出索引 20,保持索引计数从零开始。

问题出现在 iOS 10.1 iphone 7 plus 设备中,而不是模拟器 iPhone 7 plus iOS 10.1 (14B72)

调试值 {长度 = 2,路径 = 0 - 14}

NSIndexPath 路径应该是 0 - 15 但它给出了 0 - 14。

使用下面的代码在 UIButton 单击操作方法中获取 NSIndexPath,它工作正常。

尝试下面的代码并检查:

-(void)checkButtonAction:(id)sender

      UIButton *btn = (UIButton *)sender;

      CGPoint origin = btn.frame.origin;
      CGPoint touchPoint = [btn.superview convertPoint:origin toView:self.tableview];

      NSIndexPath *indexPath = [self.tableview indexPathForRowAtPoint:touchPoint];

}
[YOURBUTTON addTarget:self action:@selector(METHODNAME:event:) forControlEvents:UIControlEventTouchDown];

按钮点击方法

-(IBAction)METHODNAME:(UIButton*)sender event:(id)event
{

    NSSet *touches = [event allTouches];

    UITouch *touch = [touches anyObject];

    CGPoint currentTouchPosition = [touch locationInView:YOUR_TABLEVIEW];

    NSIndexPath *indexPath = [YOUR_TABLEVIEW indexPathForItemAtPoint: currentTouchPosition];
   // your requirement code 
}

如果对此代码有任何疑问,请在回答中发表您的评论。 祝你好运

编码愉快。

首先尝试在 cellForRowAtIndexPath 方法中将标签编号提供给按钮

yourButton.tag = indexPath.row;


[YOURBUTTON addTarget:self action:@selector(checkButtonAction:) forControlEvents:UIControlEventTouchUpInside]

和这样的抓取

-(void)checkButtonAction:(id)sender

     UIButton * button = (UIButton *)sender;
     int indexPathOfCell = sender.tag;
}

正如 mahesh 指出的那样,Gurinder Batth 解决方案存在一个问题,即无法获取 indexPath 的部分信息。所以我想补充一个答案。

创建新的 objective-C class 继承自 UITableViewCell。让我们说 "MyTableViewCell"

现在通过创建 UIButton 的 IBOutlet 修改 MyTableViewCell.h(通过控制 + 单击 + 从 UIButton 拖动到 MyTableViewCell.h)

#import <UIKit/UIKit.h>

@class MyTableViewCell;
@protocol MyTableViewCellDelegate <NSObject>
- (void)checkButtonClicked:(MyTableViewCell *)cell;
@end

@interface MyTableViewCell : UITableViewCell

@property (weak, nonatomic) id <MyTableViewCellDelegate> delegate;
@property (weak, nonatomic) IBOutlet UIButton *checkButton;

@end

然后通过创建 UIButton 的 IBAction 修改 MyTableViewCell.m(通过控制 + 单击 + 从 UIButton 拖动到 MyTableViewCell.m)

@implementation MyTableViewCell

- (void)awakeFromNib {
    [super awakeFromNib];
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
}

- (IBAction)checkButtonAction:(id)sender {
    [self.delegate checkButtonAction:self];
}

@end

现在打开您的 ViewController.m 文件并实施我们在 MyTableViewCell.h

中创建的协议
@interface ViewController () <UITableViewDataSource, UITableViewDelegate, MyTableViewCellDelegate>

@property (weak, nonatomic) IBOutlet UITableView *myTableView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.view layoutIfNeeded];

    [self.myTableView setDataSource:self];
    [self.myTableView setDelegate:self];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyTableViewCell *myTableViewCell = [tableView dequeueReusableCellWithIdentifier:@"MyTableViewCell" forIndexPath:indexPath];

    [myTableViewCell setDelegate:self];

    return myTableViewCell;
}

#pragma mark - MyTableViewCellDelegate method

- (void)checkButtonClicked:(MyTableViewCell *)cell {
    NSIndexPath *indexPath = (NSIndexPath*)[self.myTableView indexPathForCell:cell];
    // Here access row using "indexPath.row"
    // You can access section using "indexPath.section"
}

@end