我正在尝试在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
生成空值。考虑到这两个因素,你怎么能检测出你长按哪个细胞?
答案 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时设置它。