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
团队,
我有 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