仅为 UITableViewCell 的一部分调用 didSelectRowAtIndexPath

Posted

技术标签:

【中文标题】仅为 UITableViewCell 的一部分调用 didSelectRowAtIndexPath【英文标题】:Call didSelectRowAtIndexPath only for a part of the UITableViewCell 【发布时间】:2013-10-12 15:29:05 【问题描述】:

我有一个 UITableView 填充了许多自定义 UITableViewCells。它们中的每一个都有一个彩色矩形作为子视图(目前它是一个风格化的 UIButton,但无论如何我都可以实现它)。

我希望 UITableViewCell 仅在选择该部分时调用 tableview:didSelectRowAtIndexPath:

其他类似的问题询问如何让子视图忽略事件。但这对我不起作用,因为选择该矩形之外的任何地方也会触发它。

我不确定是限制触发方法的单元格区域还是禁用从单元格触发,而是允许子视图触发方法。无论哪种方式,我都不知道实现的细节。

【问题讨论】:

为什么不用按钮动作方法? 【参考方案1】:

在 didSelect 中获取您的单元格(传递给您),并检查该单元格中的按钮是否被选中。如果是那么做你需要的,否则忽略它。

【讨论】:

哦,这是一个聪明的方法,谢谢!但是,我如何检查按钮是否被按下?另外,有没有办法让它只突出显示按钮而不是整个单元格?例如,查看“设置”应用(或任何具有主从模板的应用)。当您按下一个单元格时,它会突出显示,然后转到另一个视图控制器。当你回击时,它会继续并保持突出显示的单元格,直到 segue 动画完成,然后取消突出显示它。是否可以仅使用矩形而不是整行来获得该行为?感谢您的及时答复! 当按钮被按下时做 [button setSelected: YES];看看它是否被选中做 button.isSelected; (做相反的事情来取消选择)。但请确保将所选内容与数据源链接,否则出列单元格可能会移动按钮。要“突出显示”按钮,您可以更改按钮的颜色或图像(默认状态或选定状态)。这也可以在界面生成器中完成 如果用户按下按钮,将拇指向右移动(离开按钮)然后放开会发生什么?有没有办法只有在按下按钮并松开时才采取行动? 对不起这么多cmets。我该怎么做[button setSelected: YES]?我必须为按钮设置一个目标方法,对吗?如果我这样做,didSelectRowAtIndexPath 将不会被调用。调用它的唯一方法是如果我们禁用选择按钮的功能(使其“事件透明”,正如我听到一些人所说的那样)【参考方案2】:

我不知道你为什么要调用 didSelectRowAtIndexPath: 但是如果你想从按钮接收触摸事件,你可以将按钮按下事件(内部触摸)连接到表视图控制器,如果你已经继承它或连接如果您已将其委托给表视图控制器的委托,则将其委托给它。如果您需要实际选择行,则可以调用selectRowAtIndexPath:animated:scrollPosition: 并在按下按钮时以编程方式选择行。

【讨论】:

如果我执行第二个实现,它不会阻止用户选择按钮之外的行。第一个问题是我可能会丢失从委托方法 didSelectRowFromIndexPath 获得的任何额外行为。我对ios不是很流利,所以我不确定。如果我只是让它调用我自己的目标方法,那么 didSelectRowAtIndexPath 方法做的所有事情是什么?例如,看看我对@WilliamFalcon 的评论,我仍然会用我自己的方法得到这种行为吗? 委托方法的整个想法是它们是您添加自定义行为的地方。如果您不委托它,它将正常运行。如果您担心有其他副作用,可以手动调用 selectRowAtIndexPath:animated:scrollPosition:。【参考方案3】:

您是否考虑过不调用didSelectRowAtIndexPath,而是创建一个动作让UIButton 在被触摸时触发?我不确定当UIButton 被触摸时你想要做什么,但假设你只是想在方法中推送一个新的视图控制器。

如果您使用nibstoryboard 并且您的UITableView 实例属于UITableViewController,您可以将您的UIButton 连接到如下所示的操作,

-(IBAction)buttonTapped:(id)sender 

     NewViewController *newViewController = [[NewViewController alloc] init];
     [newViewController setSomeProperty:property];
     [[self navigationController] pushViewController:newViewController animated:YES];

如果您没有使用nibstoryboard,那么您可以在init 方法或其他地方以编程方式将操作连接到UIButton

【讨论】:

它不是 UITableViewController 的根视图,但它确实有一个委托和数据源。至于这样做,请查看我对@SaintMacintosh 的评论。【参考方案4】:

创建一个UITableViewCell 的自定义子类,并在其中添加您自己的按钮。在任何你想要的区域。

【讨论】:

就像我说的,它是一个自定义单元格。就像我说的,里面有一个 UIButton。是的,它是一个子类。我将如何去做我在问题中提出的问题?

以上是关于仅为 UITableViewCell 的一部分调用 didSelectRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 UITableViewCell 在部分刷新时丢失其选择状态?

仅为部分 UIView 设置背景颜色

我如何才能激活和关联 slideToggle 函数(使用 JavaScript)仅为我试图在 foreach 循环中显示的一部分?

如何仅为 UIImage 的非白色部分设置色调颜色?

讲个笑话:今天天津地区PM2.5指数仅为381

UITableViewCell的-layoutSubviews的实现需要调用super