如何判断何时点击了 UITableView 部分索引字母?

Posted

技术标签:

【中文标题】如何判断何时点击了 UITableView 部分索引字母?【英文标题】:How to tell when a UITableView section index letter is tapped? 【发布时间】:2014-08-25 18:52:13 【问题描述】:

ios 中,是否有在点击 table view 的 section index 时调用的委托方法?例如,如果表格的部分索引列出了字母 A-Z 和 B 被点击,我如何确定用户点击了哪个字母?我查看了整个文档,但找不到任何东西。

【问题讨论】:

+1。我最初投了反对票,因为我认为这是文档中明显的委托方法,但奇怪的是,它不存在! 感谢您的检查。 :) 是的,我很困惑。你会认为这很容易。 @capitallt 我能问一下你为什么要这样做吗?除了滚动到该部分之外,您还想做什么? 当用户沿着部分索引滑动时,我想添加一个带有字母的 HUD。记住旧的 iPod 经典,当你旋转得足够快时,它会开始从一个字母跳到另一个字母,并会显示一个带有大写字母的黑白 hud 部分。只是给用户一些很好的反馈。 【参考方案1】:

我认为有两种合理的解决方案可以实现您的目标。

首先,您可以覆盖委托方法scrollViewDidScroll: 以在偏移量发生变化时显示和更新HUD。当然,这会导致它在用户在没有索引的情况下滚动时出现。当滚动视图的draggingdecelerating 属性为YES 时,您可以通过简单地禁用HUD 的显示来防止大多数情况。在某些情况下仍会出现 HUD(例如 scrollToTop、调整大小),但这可能对您来说是可以接受的。

另一种选择是构建自己的索引控件。使用几个手势识别器在表格视图右侧的自定义视图中布置一些标签确实不是很多工作。然后您可以滚动表格视图并显示您想要的任何 HUD。

【讨论】:

+1。另一种解决方案:您可以继承UITableView 并覆盖touchesBegan:… 方法来检测用户手指的位置。这将允许您仅在用户的手指位于表格视图的右侧时才显示 HUD。 (你甚至可能不需要实现scrollViewDidScroll:。)【参考方案2】:

没有允许您确定何时点击节索引字母的委托。但是,您仍然可以相当轻松地做到这一点。

如果我们使用UIScrollViewDelegatescrollViewDidScroll 设置断点,我们可以非常接近用户点击索引的时间,看看我们可以利用哪些消息。这是用户点击索引后直接查看的帧:

frame #1: UIKit`-[UIScrollView(UIScrollViewInternal) _notifyDidScroll] + 56
frame #2: UIKit`-[UIScrollView setContentOffset:] + 645
frame #3: UIKit`-[UITableView setContentOffset:] + 362
frame #4: UIKit`-[UIScrollView(UIScrollViewInternal) _setContentOffset:animated:animationCurve:animationAdjustsForContentOffsetDelta:] + 669
frame #5: UIKit`-[UITableView _sectionIndexChangedToIndex:title:] + 285
frame #6: UIKit`-[UITableView _sectionIndexChanged:] + 189

所以,UITableView 有一个私有方法 _sectionIndexChanged。此外,在索引更改后,UITableView 内部调用 setContentOffset。这些中的任何一个都可以用来提供一种机制来确定何时点击节索引。

如果我这样做,我可能会继承 UITableView 来拦截 _sectionIndexChanged 并扩展 UITableViewDelegate 协议以提供所需的消息。或者,您可以继承 UITableView 并拦截 setContentOffset,但这需要注意在调用 setContentOffset 时未点击索引的极端情况。

【讨论】:

继承 UITableView 并覆盖私有方法听起来可能可行,但我认为它会带来一些拒绝风险。或者,暴露这一点,操作系统更新的损坏风险。 @JesseRusak 当然。 OP 要求做一些如果不从头开始滚动您自己的 tableView 或稍微调整一下就不可能的事情。我把它留给 OP 来确定他的用例是否值得。

以上是关于如何判断何时点击了 UITableView 部分索引字母?的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 中点击时找出部分标题的部分

检测 UITableView 部分标题何时捕捉到屏幕顶部

如何检测 UITableView 标题何时滚动?

如何知道 UITableView 动画何时完成?

UITableView/UIScrollView 如何自动知道 ContentSize 何时发生变化?

iPhone SDK:我应该如何/何时发布 UITableView 委托对象?