簡體   English   中英

在 iOS 中顯示多列表格的最有效方法是什么?

[英]What is the most efficient way to display a table with multiple columns in iOS?

我的問題是加載緩慢,滾動速度很快。

我必須顯示一個有 10 列的表格:

+-----+------+------+------+------+------+------+------+------+-------+ | Pos | Name | Col3 | Col4 | Col5 | Col6 | Col7 | Col8 | Col9 | Col10 | +-----+------+------+------+------+------+------+------+------+-------+ | 1 | Foo | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 2 | Bar | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 3 | Baz | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +-----+------+------+------+------+------+------+------+------+-------+

忽略表頭(我不是顯示它)我使用UITableView與子類UITableViewCell來表示數據。

我的自定義UITableViewCell有 10 個UILabel子視圖,全部添加到它的contentView 每列一個。

我只是在UITableView上的cellForRowAtIndexPath方法中為每個UILabel子視圖設置文本值。

在任何時候,屏幕上大約有 14 行。 滾動速度超級快。 我的reuseIdentifier運行良好。

但是,表的初始加載速度明顯較慢。 比我使用UITableView其他屏幕慢很多,但那些列的數量要少得多。

我的單元格都設置為opaque (我理解這是默認設置)。

我缺少什么技巧嗎? 是否有太多的意見? 我應該采取另一種方法嗎? 或者我做得很好,我應該在我的代碼中尋找另一個影響加載時間的問題嗎?

更新:

我已經運行了儀器,大部分時間(500 毫秒 74.5%)是:

CA::Layer::layout_and_display_if_needed(CA::Transaction*)

更新:

一些人認為我的數據是瓶頸。

我正在使用NSFetchedResultsController

沒有計算。 每行的數據直接從相應的實體加載,數據按原樣顯示。 我不會遍歷對象圖來從任何其他關系或類似的東西中獲取數據。

啟用 CoreData SQLDebug ,我可以看到 20 行的總提取執行時間為 0.0014 秒。 我的批量大小設置為 20(比屏幕上可見的略多)以幫助滾動。

滾動速度非常快,所以我認為數據不是這里的問題。

UITableViews 通常用於顯示一列數據。 您可以將UICollectionView用於此類事情。

或者,如果您想以一種艱難的方式進行操作,您可以基於 scrollview 實現您自己的表格視圖。

但是關於緩慢加載 - 你是從某個網絡服務加載數據還是只是簡單的演示,所有數據的值都相同?(如果不是 - 嘗試這種方式來理解問題)

嘗試一次插入一行,假設在您的 viewDidLoad 或 viewwillappear 中,如果您嘗試獲取所有數據並進行一些計算,則需要時間。 所以我的建議是將一行數據插入它,然后再插入另一行。

您可以嘗試自定義 tableview 示例: https : //github.com/Viacheslav-Radchenko/TSUIKit

希望對你有幫助

:)

通過一些更改,我現在將屏幕加載所需的時間減少了一半。

主要的變化是我不再在每一行上使用 10 個不同的子視圖(每列一個子視圖)。 相反,我現在每個單元格只使用一個子視圖。

為了讓每個單元格顯示數據,我使用了附加到單元格contentView的子類UIView

在那個子類UIViewdrawAtPoint:withAttributes:drawRect方法以使用drawAtPoint:withAttributes: 用不同的文本和位置調用 10 次似乎比定位 10 個不同的UILabel快得多。

StackOverflow 上的這個答案為我指明了正確的方向。

另一個較小的更改是緩存NSClassFromString(myCustomCellName)的結果,每次為表中的每一行調用新的結果(當然除非它被重用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM