队
我有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。
答案 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