gpt4 book ai didi

ios - 如何区分第一个单元格的索引路径和表末尾空白区域的索引路径?

转载 作者:行者123 更新时间:2023-11-29 00:57:41 26 4
gpt4 key购买 nike

我使用以下代码来检测对 UITableView 的点击,并根据点击的单元格和点击单元格中的元素采取行动,对不匹配的任何元素执行默认操作。

-(void)addTapRecognizer {
// this is called when the view is created
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
singleTap.delegate = self;
singleTap.numberOfTapsRequired = 1;
singleTap.numberOfTouchesRequired = 1;
[self.tableView addGestureRecognizer:singleTap];
}

- (void)handleTap:(UITapGestureRecognizer *)tap {
NSLog(@"tap detected!");
if (UIGestureRecognizerStateEnded != tap.state) {
return;
}
UITableView *tableView = (UITableView *)tap.view;
CGPoint p = [tap locationInView:tap.view];
NSIndexPath* indexPath = [tableView indexPathForRowAtPoint:p];
[tableView deselectRowAtIndexPath:indexPath animated:NO];

NSLog(@"selectedIndex = %ld", (long)indexPath.row);
// take action depending where the cell was clicked
// with a default action if no element matches
MyTableViewCell *cell = (MyTableViewCell *) [self.tableView cellForRowAtIndexPath:indexPath];
CGPoint pointInCell = [tap locationInView:cell];
if(CGRectContainsPoint(cell.someImage.frame,pointInCell)) {
[self openItemID:[ItemList[indexPath.row] valueForKey:ID_ITEM]];
return;
}
if (...) {
...
return;
}
[self openItemID:[ItemList[indexPath.row] valueForKey:ID_ITEM]];
return;
}

我的问题是,当没有足够的单元格填满屏幕时(例如,表格包含 2 个单元格,然后是下面的空白区域),当用户在最后一个单元格下方单击时,这将被视为单击第一个单元格(控制台在两种情况下都记录“selectedIndex = 0”)。

有没有办法区分这种点击,在表格末尾的空白区域,点击表格的“适当”单元格?

最佳答案

Is there a way to tell the difference between such a click, in the empty space at the end of the table, and a click on a "proper" cell of the table?

是的。对于便宜且简单的解决方案,只有在您实际获得 indexPath 时才执行您尝试执行的操作:

 NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:p];
if(indexPath != nil){
// do everything in here
}

基本上,您的 indexPath 返回 nil,因为它找不到一行。 From the docs :

An index path representing the row and section associated with point, or nil if the point is out of the bounds of any row.

您可以按照目前的方式进行操作,但是您有什么理由不使用:

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

这是检测用户点击的单元格的更标准的方法。

如果您点击的不是单元格且具有许多其他好处,则不会调用此方法。首先,您可以免费获得对 tableView 和 indexPath 的引用。但是您也不需要任何手势识别器。

尝试这样的事情:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
// Do stuff with cell here...
}

显然,这一切都假定您已正确设置一个类作为 TableView 的委托(delegate)。

注意:当使用 Xcode 的自动完成功能执行此操作时,很容易错误地编写 didDeselectRowAtIndexPath 而不是 didSelectRowAtIndexPath。我总是这样做,然后在 20 分钟后不可避免地意识到我的错误。

关于ios - 如何区分第一个单元格的索引路径和表末尾空白区域的索引路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37457321/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com