如何将 UITableViewCell 显示为选中并仍接收 didDeselectRowAtIndexPath
Posted
技术标签:
【中文标题】如何将 UITableViewCell 显示为选中并仍接收 didDeselectRowAtIndexPath【英文标题】:How to show a UITableViewCell as selected and still receive didDeselectRowAtIndexPath 【发布时间】:2017-03-28 14:53:50 【问题描述】:我有一个 UITableView,当isEditing=YES
显示带有标准 ios 选择圆形“复选框”的单元格时(见下图)。其中一些通过 CoreData 被“收藏”。
tableView:willDisplayCell
从 CoreData 读取并设置
cell.selected = YES;
用于添加书签的单元格。
问题是这些“加书签”的单元格不响应
tableView:didDeselectRowAtIndexPath
或
tableView:didSelectRowAtIndexPath
而相同的回调在 cell.selected=NO;
的单元格上工作正常
图片显示了一个选中的单元格在一个未选中的单元格上方。
这是在里面执行的
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
if (tableView.isEditing)
[cell setSelected:[self isCellFave:indexPath]];
isCellFave
在哪里
- (BOOL) isCellFave:(NSIndexPath *) indexPathIn
BOOL isSelected = NO;
// Check if this cell is a favourite
NSError *error;
NSString * id = [self getIDFromIndexPath:IndexPathIn];
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Event"];
request.predicate = [NSPredicate predicateWithFormat:@"( id = %@ )", id];
request.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:@"sort1" ascending:YES selector:@selector(caseInsensitiveCompare:)]];
NSArray *fetchedObjects = [ManagedContext executeFetchRequest:request error:&error];
if ([fetchedObjects count] !=0) //if a result then it is a fave
// When we set a cell as selected, all gestures stop working - so we can't deselect it.
isSelected=YES;
return isSelected;
【问题讨论】:
"从 CoreData 读取并设置 cell.selected = YES;"对我来说听起来很可疑。你能发布那个代码吗? 我发布了关于您的问题的答案@Nick T @handiansom 感谢您指出这一点。但它并没有真正回答我的问题,这就是为什么在取消选择时不调用 tableView:didDeselectRowAtIndexPath 的原因。我真正的问题是如何取消选择选定的单元格。感谢您的部分回答。 @NickT 我添加了取消选择的新答案。试试看。它可能会有所帮助。 :) 【参考方案1】:尝试使用这些代码。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
if (tableView.isEditing)
[cell setSelected:[self isCellFave:indexPath]];
[cell addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(unselectRow:)]];
然后添加一个点击手势处理程序
- (void)unselectRow:(UITapGestureRecognizer *)sender
UITableViewCell *cell = (UITableViewCell *) sender.view;
cell.selected = NO;
【讨论】:
奇怪,它有 2 个赞成票,我点击赞成票,它下降到 1。 @NickT,要么两个人在 5 分钟内撤销了他们的投票,要么你撤销了自己的投票。【参考方案2】:点击选定的单元格不会调用
tableView:didSelectRowAtIndexPath
tableView 委托方法,因为 单元格已被选中。如果您点击未选择的单元格,它将工作/或被调用。
【讨论】:
以上是关于如何将 UITableViewCell 显示为选中并仍接收 didDeselectRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell 按钮在滚动之前不显示选中或取消选中状态
了解 inputView 和 firstResponder:如何创建一个将 UIDatePicker 显示为键盘的 UITableViewCell?