2011-03-17 102 views
3

我有一個UITableView,帶有一個可見的ScopeBar的SearchBar。我已經實現了所有必需的委託和數據源方法來支持表索引。然而,當顯示錶格視圖時,沒有顯示區段索引。顯示搜索結果表格時,會顯示部分標記。什麼阻止UITableView索引出現?

我實現了this answer的代碼片段,並確認主表實際上是編入索引的。

我真的難住了。日誌記錄表明,一切都準備好了,但我不能爲我的生活弄清楚爲什麼主表不顯示索引。是的,主表的索引是設置的;我可以在我的日誌中看到他們。

對於主表,我可以看到索引標題被請求並返回,但不顯示。

對於搜索結果表,會出現相同的日誌記錄(標題被請求並返回),並顯示它們。

有一點需要注意,雖然我不能看到這是如何導致表中的索引不出現,是搜索欄類實際上是簡單地覆蓋setShowsScopeBar:用它強制是一個子類。我試過我的應用程序,沒有這個覆蓋。相同的結果:在主表視圖中沒有索引。

所以問題是:即使支持索引的所有必需的委託和數據源方法都已到位(並且至少在搜索結果表中工作,因爲方法被調用並且該指數顯示該視圖。)

謝謝!

+1

我發現了一些事情。 1.如果沒人能回答你的StackOverflow問題,你就知道你有麻煩了。 :-) 2.在SDK中似乎存在一個錯誤:'-realoadSectionIndexTitles'不起作用。我不得不求助於在表上發佈一個延遲的'-loadData'來使索引出現。大!我發現了第二個bug,這個範圍欄始終是可見的,即使全屏幕高度可用,一組很長的索引也會被縮小到屏幕高度的一半。激活並取消搜索欄「修復」它。我會嘗試使用較少的索引標題... – 2011-03-18 15:57:40

+0

Fwiw,我提交了兩個與蘋果的錯誤:「reloadSectionIndexTitles不起作用」和「節索引標題不必要地擠壓」。可能是dups,但你永遠不知道。 – 2011-03-18 16:37:22

回答

2

因此,經過這幾個月,這裏就是解決這個問題的方法。

首先,iOS 4.3 SDK中的-reloadSectionIndexTitles看起來似乎沒有做任何關於(重新)在視圖中顯示節索引標題的內容。我仍然必須使用-reloadData,這是不幸的,但最終沒關係。 (沒有嘗試過任何較新的iOS版本,FWIW ...)

現在,最初的問題是索引標題出現在屏幕右邊緣的上半部分,好像鍵盤正在顯示。但沒有鍵盤顯示!

所以我不得不想:鍵盤顯示是什麼?第一響應者標記的東西通常會導致鍵盤顯示! (或者,別的東西錯誤地表明鍵盤正在顯示。)在我看來,唯一能做到的就是搜索欄。

這裏是情節變濃的地方。我的搜索欄有一個範圍欄,我希望它始終可見。這是非標準的。因此,要做到這一點,我子類UISearchBar和推翻-searchBar:setShowsScopeBar:

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

    [self resignFirstResponder]; 
} 

我最初的實現不包括調用resignFirstResponder。所以,無論何時在我的UISearchBar實例上調用此方法(僅告訴超類設置可見的範圍欄),搜索欄(或可能是範圍欄)被標記爲第一響應者,但不顯示鍵盤。這反過來,盡我所知,有一個效果,當表視圖顯示段索引標題的時候,它認爲是第一響應者並提出了一個擠壓指數。表格視圖部分的這種錯誤假設進一步證明了這一事實,即表格的拉特行可以在屏幕上方向上滾動 - 就像鍵盤顯示一樣!

將呼叫添加到resignFirstResonder通過清除錯誤設置的任何狀態來解決此問題,以指示(某處)鍵盤正在顯示。如預期的那樣,該指數出現在全屏幕高度。

很。離奇。

我花了很多時間搞清楚這一點。也許這種行爲是我的實現的一個副產品,無可否認,它是非標準的(範圍欄在3個選擇中更像是一個UISegmentedControl)。無論如何,在我加入電話號碼resignFirstResponder之前的行爲至少意外。

我以爲我會爲任何可能在未來遇到此問題的人發佈決議。希望能幫助到你。