如何将UITableViewCell显示为已选中且仍然接收didDeselectRowAtIndexPath

时间:2017-03-28 14:53:51

标签: ios objective-c uitableview cocoa-touch

我有一个UITableView,当isEditing=YES显示带有标准iOS选择圆形'复选框'的单元格时(见下图)。其中一些是通过CoreData“加入书签”。

tableView:willDisplayCell从CoreData读取并设置 标记的单元格cell.selected = YES;

麻烦的是这些'加书签的'单元格不响应

tableView:didDeselectRowAtIndexPath

tableView:didSelectRowAtIndexPath

尽管相同的回调在cell.selected=NO;

的单元格上正常工作

图像显示非选定单元格上方的选定单元格。enter image description here

这是在

中执行的
- (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;
}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

  

点击选定的单元格不会调用   tableView:didSelectRowAtIndexPath tableView委托方法因为那个   单元格已被选中。如果点击未选中的单元格,它将工作/或被调用。