Ios 如何获取正在点击的单元格的索引?

Ios 如何获取正在点击的单元格的索引?,ios,uitableview,ibaction,nsindexpath,Ios,Uitableview,Ibaction,Nsindexpath,当长按UITableView中的单元格时,我尝试执行iAction。该操作涉及单元格的内容,因此我需要获取indexPath,以便从本地存储中的字典中检索内容。iAction方法在MasterViewController.m文件中定义,该文件包含UITableView方法,并且是UITableViewController的子类。我已经尝试了以下所有方法,它们都返回null而不是单元格的indexPath UITableViewCell *cell = (UITableViewCell *)sel

当长按UITableView中的单元格时,我尝试执行iAction。该操作涉及单元格的内容,因此我需要获取indexPath,以便从本地存储中的字典中检索内容。iAction方法在MasterViewController.m文件中定义,该文件包含UITableView方法,并且是UITableViewController的子类。我已经尝试了以下所有方法,它们都返回null而不是单元格的indexPath

UITableViewCell *cell = (UITableViewCell *)self;
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
我也看到了几年前关于类似问题的答案,这些答案都是使用了视图中单元格的位置,但我也无法让这些答案中的任何一个起作用

更新: iAction sendToPB正在UITableViewController的子类中定义。Interface Builder中的单元格中添加了一个长按手势识别器,已发送的动作连接到sendToPB。当您在表格视图中长按单元格时,操作应该是将单元格内容复制到剪贴板。到目前为止,我尝试的所有方法都会为indexPath返回null

- (IBAction)sendToPB:(id)sender {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    NSString *object = self.objects[indexPath.row];
    UIPasteboard *pb = [UIPasteboard generalPasteboard];
    NSString *pressedCellText = [[Data getAllNotes] objectForKey:object];
    [pb setString: pressedCellText];
}
更新:
我发现这种方法有两个问题。首先,长按手势实际上并没有选择行,这就是为什么使用indexPathForSelectedRow的所有选项都不起作用的原因。其次,sender是手势识别器,而不是单元格或行,因此使用sender也会为indexPath生成空值。考虑到这两个因素,还有什么方法可以检测到您长按了哪个单元格?

编辑:多亏了@RegularExpression

首先确保设置tableView的委托

我相信这就是你想要的:

迅捷的

然后,您可以保存来自上述方法的索引,或者在上述方法中通过该索引调用您的操作

目标-C


您可以将UITableViewCell子类化,并为索引路径添加IVar,并在为UITableView数据源协议调用CellForRowatineXpath时设置它。

如果它在UITableViewController子类中,然后,将UITableViewController子类的实例self强制转换为UITableViewCell不会返回所选的单元格

有两种方法可以做到这一点:

1-简单的方法:不要使用iAction,只需实现委托方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
2-相对简单的方法:在IBaction中,您可以使用以下属性获取所选单元格:

self.tableview.indexPathForSelectedRow

此属性将为您提供所选单元格的indexpath。

将.h文件中的第一个变量声明为

 NSIndexPath *hitIndex;
然后在长按方法上,u可以得到单元的位置&因此是不确定的

(void)longPressMethod:(UIButton *)btn
{

CGPoint hitPoint = [btn convertPoint:CGPointZero toView:tbl_traits];
hitIndex = [tbl_traits indexPathForRowAtPoint:hitPoint];

}

你可以用手势识别器来识别。希望这些片段能对……有所帮助

在您的.h文件中

在viewDidLoad中

longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDetected:)];
longPressRecognizer.minimumPressDuration = 2;
longPressRecognizer.numberOfTouchesRequired = 1;
longPressRecognizer.delegate = self;
在cellforrowatinexpath中,就在return语句之前

[cell addGestureRecognizer:longPressRecognizer];
最后,

- (void) longPressDetected:(UILongPressGestureRecognizer *)recognizer 
{
    UITableViewCell *selectedCell = (UITableViewCell *)recognizer.view;
    // Your required code here
}

您可以在LongPress手势上获得这样的indexPath

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
     CGPoint p = [gestureRecognizer locationInView:self.myTableView];

     NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:p];
     if (indexPath == nil) {
         NSLog(@"long press on table view but not on a row");
     } 
     else if (gestureRecognizer.state == UIGestureRecognizerStateBegan) 
     {

         NSLog(@"long press on table view at row %d", indexPath.row);
     } 
     else 
     {
         NSLog(@"gestureRecognizer.state = %d", gestureRecognizer.state);
     }
}
如果您通过调用cell将UILongPressGestureRecognizer连接到单元格,则此链接可能会对您有所帮助。AddGestureRegonizer\u:\您应该通过执行以下操作从发件人检索单元格

let touchedView = sender.view as! UITableViewCell

无论如何,实现这一点的最佳方法通常是检查数据源,而不是在调试时调用UITableViewDataSource方法

,self看起来是什么类型的对象?您可以将其转换为表格单元格,但也可以像调用视图控制器一样调用self.tableView。添加代码片段以向单元格添加长手势您需要显示更多代码。显示如何设置和处理长按。请查看下面的答案,然后尝试NSIndexPath*indexPath=self.tableview.indexPathForSelectedRow,然后设置断点并报告indexPath和object的值。@No,这可能会使手势识别器成为发送者。为什么不使用调试器进行检查。但请确保设置了代理。如果您试图确定是否在没有内部润色的情况下长按了一次,我认为这不起作用。什么是tbl_特性?为什么hitIndex需要ivar?你指的是哪个.h文件?tbl_trait是tableview的对象,hitIndex是NSIndexPath对象,这样你就可以使用hitIndex.row获取单元格的内容,.h是简单的controllers.h文件来声明变量。在OP的问题中,哪里提到了tbl_trait和简单的controller?您的答案令人困惑且不符合上下文。simple controller只是您添加了tableview的控制器,tbl_trait是tableview的对象,longpress手势方法将用于该对象,您可以按如下方式添加此方法:UILongPressGestureRecognizer*lpgr=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selectorlongPressMethod:;lpgr.minimumPressDuration=2.0//秒lpgr.delegate=self;[self.tbl_traits addgesturecognizer:lpgr];[lpgr释放];用户希望检测长按。对不起,老兄,-1。@LibranCoder我想你对否决权的规则感到困惑。我建议你
回顾它们。OP的问题是如何确定选定的单元格,而不是如何创建长按手势识别器。我为误解感到抱歉。@librancoder是对的,问题是检测长按的单元格,而不是哪个是选定的单元格。对你回答的问题投下其他答案也没什么错!如果你读了一个问题,看到了一个你认为是错误的答案,并且有了一个你认为是正确的答案,你为什么不投反对票?@LibranCoder我认为如果我们为了自我推销的利益而允许投反对票,或者不进行宣传,那么社区将无法区分基于质量和自我推销的被否决的答案。我的2美分……在你回答的同一个问题上否决别人的答案是非常不道德的。这表明你这样做是为了推销你的答案。是OP或本QA的其他观众应该投赞成票或反对票。好吧,如果是这样的话,我很抱歉。我对这一点还不太熟悉。你能为我提供一个合适的规则链接吗?我收回我的反对票,没问题。有一天我们都是新人!谢谢不过,任何指向规则或指导原则的链接都会很有帮助。您没有做错任何事情,而元堆栈溢出是了解规则等内容的最佳场所。不要只是从另一个答案中复制一大块内容。这充其量只是一个评论。是的,但我也把那个链接放在了我复制的地方,用户只需要indexpath,所以我复制了它!
[cell addGestureRecognizer:longPressRecognizer];
- (void) longPressDetected:(UILongPressGestureRecognizer *)recognizer 
{
    UITableViewCell *selectedCell = (UITableViewCell *)recognizer.view;
    // Your required code here
}
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
     CGPoint p = [gestureRecognizer locationInView:self.myTableView];

     NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:p];
     if (indexPath == nil) {
         NSLog(@"long press on table view but not on a row");
     } 
     else if (gestureRecognizer.state == UIGestureRecognizerStateBegan) 
     {

         NSLog(@"long press on table view at row %d", indexPath.row);
     } 
     else 
     {
         NSLog(@"gestureRecognizer.state = %d", gestureRecognizer.state);
     }
}
let touchedView = sender.view as! UITableViewCell