UITableView选择的indexpath值给出错误

时间:2016-12-19 07:29:13

标签: ios objective-c uitableview didselectrowatindexpath nsindexpath

我有UITableView,其中有50多个细胞计数。 每个细胞的宽度为60。

当我向上滚动到20个单元格,然后点击任何单元格

它给出了索引路径值高于单元格值而不是单击单元格值

Inside 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加iOS 10.1(14B72)中

调试值  {length = 2,path = 0 - 14}

NSIndexPath路径应为0 - 15,但它给出0 - 14。

4 个答案:

答案 0 :(得分:5)

[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 
}

如果对此代码有任何疑问,请将评论置于答案中。 祝你好运

快乐编码。

答案 1 :(得分:1)

使用以下代码在NSIndexPath点击操作方法中获取UIButton,并且工作正常。

尝试以下代码并检查:

-(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];

}

答案 2 :(得分:1)

首先尝试将标签号设置为cellForRowAtIndexPath方法

中的按钮
+---------+-----+-------+-------+
| subject | id  | start | end   |
+---------+-----+-------+-------+
| Dutch   | 120 | 12:30 | 13:30 |
+---------+-----+-------+-------+
| English | 111 | 09:30 | 11:30 |
+---------+-----+-------+-------+
| English | 111 | 15:30 | 16:30 |
+---------+-----+-------+-------+
| Java    | 109 | 14:30 | 15:30 |
+---------+-----+-------+-------+

和这样的抓取

yourButton.tag = indexPath.row;


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

答案 3 :(得分:1)

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

创建继承自UITableViewCell的新Objective-C类。让我们说" 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