gpt4 book ai didi

ios - 如何使用自定义 UITableViewCell 子类进行(自定义)选择

转载 作者:行者123 更新时间:2023-11-29 03:19:34 25 4
gpt4 key购买 nike

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

This control does not track touches. The delegate of the table view can manage check marks in a section of rows (possibly limiting the check mark to one row of the section) in its tableView:didSelectRowAtIndexPath: method.

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

但实际上我对此并不介意。我真的不想要一个复选标记,我宁愿做一些像邮件一样的事情,当它在左侧进行多选时,单选按钮式的圆圈。这让我对如何进行感到困惑。我是否应该只在右侧添加一个按钮控件,在我的自定义单元格子类中适本地操作图像?在那种情况下,我会弄乱按钮的背景图像吗?还是只是图像?既然选择一个需要取消选择其他,那么将它连接到 TableView 委托(delegate)而不是子类的最佳方法是什么?或者我应该创建一个自定义的 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"];
}

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

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

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

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

self.clearsSelectionOnViewWillAppear= NO;

无论我在 Storyboard 中设置什么,该值都是 YES,因此返回列表就是清除我的选择。

最佳答案

您要为您创建的每个单元格添加一个手势吗?我会从那里支持它并在主 Controller 上创建一个手势来保存你的表格 View (而不是单个单元格)。

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

- (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 时,您可以触发选择状态。

关于ios - 如何使用自定义 UITableViewCell 子类进行(自定义)选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21270308/

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