如何将 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 背景颜色

UITableViewCell 滚动时变为蓝色

UITableViewCell 按钮在滚动之前不显示选中或取消选中状态

了解 inputView 和 firstResponder:如何创建一个将 UIDatePicker 显示为键盘的 UITableViewCell?

如何将 JSON 中返回的图像 URL 显示为 UITableViewCell 的缩略图

创建类似于选中的 UITableViewCell 的 UILabel 背景