如何判断UITableView的索引字母被点击了?

3
在iOS中,当表视图的分段索引被点击时,是否有一个委托方法被调用?例如,如果表格的分段索引列出字母A-Z并且点击了B,我该如何确定用户点击了哪个字母?我已经在文档中查找了很久,但是没有找到相关信息。

+1. 我最初投了反对票,因为我认为这在文档中是一个显而易见的委托方法,但奇怪的是,它并没有出现在那里! - Jesse Rusak
谢谢您的查看。:) 是啊,我感到相当困惑。你会认为这很容易。 - Canucklesandwich
@capitallt 可以问一下你为什么想要这样做吗?除了已经实现的滚动到该部分之外,你还想做什么? - Jesse Rusak
1
我想在用户沿着索引栏滑动时添加带有字母的HUD。还记得旧款iPod经典版吗?当您快速转动时,它会从一个字母跳到另一个字母,并显示黑白色的HUD,其中包含该部分的大写字母。这为用户提供了美好的反馈体验。 - Canucklesandwich
2个回答

1
没有委托可以让您确定何时点击了部分索引字母。但是,您仍然可以相当容易地做到这一点。
如果我们使用UIScrollViewDelegate scrollViewDidScroll设置断点,我们就可以接近用户点击索引的时间,并查看我们可能能够利用的消息。以下是用户点击索引后直接看到的框架:
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并覆盖私有方法听起来可能会奏效,但我认为它会带来一些拒绝风险。或者,在此基础上,可能还存在跨操作系统更新时出现问题的风险。 - Jesse Rusak
当然可以。OP正在要求做一些不可能的事情,除非从头开始自己编写tableView或进行一些交换操作。我让OP决定他的用例是否值得这样做。 - memmons

1
我认为有两种合理的解决方案可以适用于您的目标。
首先,您可以覆盖委托方法 scrollViewDidScroll: 以显示和更新 HUD(指“正在加载中”等提示信息),如果偏移已更改。当然,这将导致在用户滚动而没有索引时出现它。您可以通过简单地禁用 HUD 的显示来防止大多数这些情况,当滚动视图的 draggingdecelerating 属性为 YES 时。仍会有一些情况下 HUD 会出现 (例如 scrollToTop、resizing),但这可能对您是可以接受的。
另一个选择是构建自己的索引控件。在表格视图的右侧布置几个标签并添加一些手势识别器,真的不需要花费太多工作量。然后您可以滚动表格视图并显示任何您想要的 HUD。

另一种解决方案:您可以子类化UITableView并覆盖touchesBegan:…方法以检测用户手指的位置。这将允许您仅在用户的手指位于表视图右侧时显示HUD。(您甚至可能不需要实现scrollViewDidScroll:。) - Aaron Brager

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接