2014-07-08 131 views
0

我有一個相當簡單的UITableView,它使用NSArray的航班預訂,並且每個預訂顯示一個單元格。最近客戶提出了一個問題(我只能偶爾重現),其中一些單元格完全隱藏。他們的空間在那裏,但是他們應該存在差距。UITableView隨機消失的單元格

表中有一個頁眉和頁腳,所以我可以看到差距(這不僅僅是有更少的元素)。

示例屏幕截圖在這裏:http://myflightsapp.com/images/missing-cells.png

這真的是間歇性的,因爲如果我重新啓動應用程序,這個問題就會消失。

我已經嘗試用一個非常簡單的2班輪替換cellForRowAtIndexPath來返回一個完全標準的UITableViewCell與文本標籤,並且它顯示相同的問題,所以對於我來說,規定了Nib/Custom類是問題。

heightForRowAtIndexPath始終返回一個常量,因此它不會錯誤地顯示零高度行。

表中只有1段。

我把調試的numberOfSectionsInTableView方法,它總是返回(在本例中2)正確的數字

我已經把調試中的cellForRowAtIndexPath,從中我學到: 1)如果我將表視圖向上拖動到足夠高的位置(以便單元格從屏幕上消失),然後再放開,在出現問題的情況下,它不會再次調用cellForRowAtIndexPath,以便在表格滾動回視圖時嘗試重繪單元格,但是當問題不存在時(即單元格全部可見),它會爲每個單元格再次調用cellForRowAtIndexPath。

2)在任何時候,任何單元格都不具有「隱藏」屬性爲真。

從其他地方添加調試(例如臨時按鈕)我可以爲未顯示的單元格手動調用cellForRowAtIndexPath方法,並返回似乎是有效的單元格。

所以我的問題是,什麼會導致我看到的問題?我沒有足夠的地方去調試,看看問題出在哪裏。

會大量讚賞任何幫助 - 我錯過了什麼?

回答

0

在Apple Dev技術支持的幫助下......我解決了它。爲了其他人的利益,原因是我不小心調用了方法來從輔助線程而不是主線程重新加載表。

要解決,我用下面的

[self performSelectorOnMainThread:@selector(refreshMethod) withObject:nil waitUntilDone:YES]; 

到目前爲止那麼好。

0

可能導致問題的原因是您沒有足夠的單元格來重複使用。沒有看到你的代碼,我只是猜測,但這是可以導致你的問題:

假設你的表是100點高,每個單元格是10分。然後,在任何給定時間,您的表格都有10個(或11個)當前在內存中查看的單元格,以及上面的10個視圖和下面的10個視圖。所以,這個表格大約有30個單元格,它會創建並重復使用。

似乎沒有足夠的單元格被創建爲在某些情況下重用。

就如何「修理」一對夫婦的想法對您的情況:

  1. 使用[myTableView reloadData]當表視圖contentOffset.y變化比表視圖frame.size.height更多。這將調用視圖中的單元格以重新創建。我不推薦這種方法,因爲如果需要重新創建大量數據或大量單元格,它可能會非常激烈。
  2. 查找實際創建了多少個單元格。您可以爲每個單元格添加一個標記並記錄每次單元格進入視圖。這可能會讓您更好地瞭解細胞如何重複使用。
  3. 根據您需要的單元數量,您可以創建每個單元,將其加載到數組中,然後返回一個唯一的單元格作爲cellForRowAtIndexPath。根據您需要的細胞數量,我認爲這可能是您的最佳選擇。
+0

一個有趣的想法,但我試過每次都強迫重新創建單元格(通過嘗試不去除單元格並強制每次創建一個新單元格)。也考慮到這發生在2個單元格中,我不認爲就是這樣。 – schofs