你如何得到你正在攻击的单元格的indexPath?

时间:2014-11-04 03:58:26

标签: ios uitableview ibaction nsindexpath

我正在尝试在UITableView中对单元格执行长按时执行IBAction。该操作涉及单元格的内容,因此我需要获取indexPath以便从本地存储中的字典中检索内容。 IBAction方法在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];

我也看到了几年前在视图中使用单元格位置的类似问题的答案,但我也无法使其中的任何一个工作。

更新 IBAction,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生成空值。考虑到这两个因素,你怎么能检测出你长按哪个细胞?

7 个答案:

答案 0 :(得分:2)

将.h文件中的变量1st声明为

 NSIndexPath *hitIndex;

然后在长按法上你可以得到细胞和细胞的位置。因此indexpath

(void)longPressMethod:(UIButton *)btn
{

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

}

答案 1 :(得分:2)

您可以在longPressGesture上获得indexPath Like This!

-(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);
     }
}

可能此链接会帮助您一点more

答案 2 :(得分:1)

您可以使用手势识别器来完成。希望这些片段有用.......

.h file

@interface yourClass ()
{
    UILongPressGestureRecognizer *longPressRecognizer;
}

在viewDidLoad中,

longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDetected:)];
longPressRecognizer.minimumPressDuration = 2;
longPressRecognizer.numberOfTouchesRequired = 1;
longPressRecognizer.delegate = self;

在cellForRowAtIndexPath中,就在return语句

之前
[cell addGestureRecognizer:longPressRecognizer];

最后,

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

答案 3 :(得分:0)

编辑:感谢@RegularExpression

首先确保设置 tableView

的代理
self.myTableView.delegate = self

我相信这就是你要找的东西:

  

夫特

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    //save the indexPath.row as an integer inside a property or pass it to your action
}

然后您可以保存上述方法的索引,或者简单地调用您在上述方法中传递该索引的动作。

  

目标-C

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

       //save the indexPath.row as an integer inside a property or pass it to your action
}

答案 4 :(得分:0)

如果这是在UITableViewController子类中,那么将self(它是UITableViewController子类的一个实例)转换为UITableViewCell将不会返回所选的单元格。

实际上有两种方法:

1-简单方法:不要使用IBAction并只实现委托方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

2-相对简单的方法:在IBaction中,您可以使用属性获取所选单元格:

self.tableview.indexPathForSelectedRow

此属性将为您提供所选单元格的索引路径。

答案 5 :(得分:0)

如果您通过调用<afp:AttributeFilterPolicy id="ldapAttributes"> <afp:PolicyRequirementRule xsi:type="basic:ANY" /> <afp:AttributeRule attributeID="mail"> <afp:PermitValueRule xsi:type="basic:ANY"/> </afp:AttributeRule> </afp:AttributeFilterPolicy> UILongPressGestureRecognizer附加到cell,则应通过

从发件人检索单元格
cell.addGestureRegognizer(_: _: _:)

无论如何,实现这一目标的最佳方法通常是检查dataSource而不是调用let touchedView = sender.view as! UITableViewCell 方法

答案 6 :(得分:-1)

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