什么阻止UITableView索引出现?

时间:2011-03-17 14:48:47

标签: ios uitableview

我有一个UITableView,其SearchBar具有可见的ScopeBar。我已经实现了所有必需的委托和数据源方法来支持表索引。然而,当显示表格视图时,没有显示部分索引。显示搜索结果表时,会显示部分标记。

我实现了this answer的代码段,并确认主表实际上已编入索引。

我真的很难过。记录表明一切都已到位,有这项工作,但我不能为我的生活弄清楚为什么主表不显示索引。是的,主表的索引是设置的;我可以在记录中看到它们。

对于主表,我可以看到请求并返回索引标题,但不显示。

对于搜索结果表,将显示相同的日志记录(请求并返回标题),并显示它们。

有一点需要注意,虽然我看不出这会导致表中的索引不出现,但是SearchBar类实际上是一个子类,它只是覆盖setShowsScopeBar:来强制它为YES。我试过我的应用程序有没有这个覆盖。相同的结果:主表视图中没有索引。

所以问题是:什么会阻止索引显示,即使支持索引的所有必需的委托和数据源方法都已到位(并且至少在搜索结果表中工作,因为方法被调用,显示该视图的索引。)

谢谢!

1 个答案:

答案 0 :(得分:2)

所以这几个月之后,这就解决了这个问题。

首先,看起来iOS 4.3 SDK中的-reloadSectionIndexTitles似乎在(重新)在视图中显示部分索引标题方面似乎没有做任何事情。我仍然必须使用-reloadData,这是不幸的,但最终还是可以的。 (没有尝试过任何较新的iOS版本,FWIW ......)

现在,最初的问题是索引标题出现在屏幕右边缘的上半部分,就像键盘正在显示一样。但没有键盘显示!

所以我开始思考:是什么让键盘显示?在第一响应者处标记通常会导致键盘显示的东西! (或者,其他东西错误地表明键盘正在显示。)在我看来,唯一能做到这一点的是搜索栏。

这是情节变厚的地方。我的搜索栏有一个范围栏,我希望它始终可见。这是非标准的。所以,为了做到这一点,我将UISearchBar分为-searchBar:setShowsScopeBar:并覆盖resignFirstResponder

- (void) setShowsScopeBar:(BOOL) show
{
    [super setShowsScopeBar: YES]; // always show!

    [self resignFirstResponder];
}

我的初始实施不包括对UISearchBar的调用。因此,每当在我的resignFirstResonder实例上调用此方法时(只是告诉超类将范围栏设置为可见),搜索栏(或可能是范围栏)被标记为第一响应者但未显示键盘。反过来,正如我所知道的那样,当表视图显示部分索引标题时,它认为某些是第一个响应者并呈现了一个压扁的索引。表格视图中的错误假设进一步证明了表格的lat行允许在屏幕中间向上滚动 - 就像键盘正在显示一样!

添加对UISegmentedControl的调用通过清除错误设置的任何状态以指示(某处)键盘正在显示来解决了该问题。现在,索引按照预期显示在全屏高度。

非常。奇异。

我花了很多时间搞清楚这一点。也许这种行为是我的实现的副产品,这被认为是非标准的(范围栏在其3个选项中的2个中更像是resignFirstResponder)。无论如何,在我将调用添加到{{1}}之前的行为至少是意料之外的。

我以为我会将这个决议发布给任何可能在未来偶然发现的人。希望它有所帮助。