【问题标题】:How to do (custom) selection with custom UITableViewCell subclass如何使用自定义 UITableViewCell 子类进行(自定义)选择
【发布时间】:2014-01-21 22:22:50
【问题描述】:

我有一个带有自定义 UITableCellView 子类的 UITableView。我想将其中一行显示为活动的或选中的。我的单元格中的控件有自己的手势,但我在右侧有可以进行选择的区域。我(天真地)认为我可以表明我想要一个复选标记样式的配件,但苹果的文档说

此控件不跟踪触摸。表视图的委托 可以管理部分行中的复选标记(可能会限制 选中该部分的一行)在其 tableView:didSelectRowAtIndexPath: 方法。

我不确定如何解释它,但我将tableView:didSelectRowAtIndexPath: 方法放在我的委托中,它永远不会触发。无论我在哪里触摸我的手机(在有或没有可触摸控件的部分)。所以我很好奇为什么这不起作用?我还注意到,无论我如何在单元格上设置 selected 属性,复选标记始终显示,所以我认为它并不是真的要用作选择指示器。

但实际上我对此很满意。我真的不想要复选标记,我宁愿做类似邮件在左侧进行多选时所做的事情,单选按钮式风格的圆圈。这让我陷入了如何进行的困境。我是否应该在右侧添加一个按钮控件,在我的自定义单元子类中适当地操作图像?在这种情况下,我会弄乱按钮的背景图像吗?还是只是图像?而且由于选择一个需要取消选择其他,将其连接到表视图委托而不是子类的最佳方法是什么?或者我应该创建一个自定义的 NSView 子类?

更新

我卸下了配件。我添加了一个 UIImageView 来显示选择状态。因为我的单元格中的子控件使用了按住手势,所以选择点击使其通过单元格的几乎所有位置。我使用以下方法同步视觉选择状态:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
    self.selectionView.image = self.selected ? [UIImage imageNamed: @"selected"] : [UIImage imageNamed: @"not_selected"];
}

在我的自定义控制器中,我添加了以下方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [Site setCurrent: self.allSites[indexPath.row]];
    [[Site current] pullValves];
}

我终于明白第一种方法是更新视觉状态,而不是响应用户意图,属于第二种方法。第一个在不同的时间触发,但第二个在用户实际点击时应用。

最后,我不得不以编程方式设置

self.clearsSelectionOnViewWillAppear= NO;

不管我在情节提要中设置了什么,该值都是YES,因此返回列表清除了我的选择。

【问题讨论】:

    标签: ios uitableview ios7


    【解决方案1】:

    您要为您创建的每个单元格添加一个手势?我会支持它并在主控制器上创建一个手势来保存你的表格视图(而不是单个单元格)。

    将此添加到您的主控制器,以便控制器可以相应地处理手势。

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
        return YES;
    }
    

    如果您需要跟踪被触摸的单元格(例如,对于平移手势),您可以获取给定手势识别器的索引路径。

    CGPoint p = [recognizer locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:p];
    

    从那里,我们回到您的目标:跟踪您的活动单元格。 tableView:didSelectRowAtIndexPath 需要被点击(希望上面的步骤在这里有所帮助)。存储您需要保持选中的项目的某种标识符。当调用 tableView:willDisplayCell:forRowAtIndexPath 时可以触发选择状态。

    【讨论】:

    • 我不确定您是如何回答我的问题的。我认为您认为我正在做的是一个坏主意(tm)。我对此很陌生,很可能接受。但我必须明白为什么......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2013-07-30
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多