【问题标题】:Call didSelectRowAtIndexPath only for a part of the UITableViewCell仅为 UITableViewCell 的一部分调用 didSelectRowAtIndexPath
【发布时间】:2023-04-01 05:10:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么不用按钮动作方法?

标签: ios objective-c uitableview 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。是的,它是一个子类。我将如何去做我在问题中提出的问题?
猜你喜欢
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多