[英]UITableView scrolling issue
我有一個帶有自定義單元格的TableView,其中一些具有圖像,而另一些則沒有。 一切正常,但是當我開始滾動時,單元格無法正確顯示(圖像放置在“錯誤的”單元格中,並在中間剪切)。 現在有人解決此問題嗎?
要了解的關鍵是表的單元格已被重用。 這樣做是為了提高滾動性能,因為創建一個新的單元格(即視圖)非常昂貴。
在方法cellForRowAtIndexPath中,返回一個單元格。 使用出隊方法創建現有單元,或者創建一個新單元。 在該單元格上,設置您想要表示的所有屬性。
我的猜測是,您將直接在單元格上設置這些屬性,例如圖像等。 然后,當您滾動時,該單元格將被重用,您將在錯誤的單元格上再次看到相同的圖像。
因此,您需要的是像NSArray這樣的單獨索引來維護模型對象。 該模型對象包含圖像的所有詳細信息,等等。
讓我們舉個例子。 我有一個包含10個對象的數組,其中前五個是圖像“ a.png”,后五個是“ b.png”。
如果我收到cellForRowAtIndexPath的回調,則要執行以下操作:
cellForRowAtIndexPath:(0,0)為數組中的對象提供索引0,即a.png cellForRowAtIndexPath:(0,1)為數組中的對象提供索引1,即a.png cellForRowAtIndexPath:(0,2)為數組中的對象提供對象數組索引2,即a.png cellForRowAtIndexPath:(0,3)為數組中的對象提供索引3,數組aForgecellForRowAtIndexPath:(0,4)為數組中的對象提供索引4,即a.png cellForRowAtIndexPath:(0,5)為數組中的對象提供索引5,即b.png cellForRowAtIndexPath:(0,6)為數組中的對象提供索引6,為b.png cellForRowAtIndexPath:(0,7)為數組中的對象提供索引數組索引7為b.png cellForRowAtIndexPath:(0,8)提供數組中的對象的索引8為數組b.png cellForRowAtIndexPath:(0,9)提供數組中的對象索引為9的b.png
現在,讓我們考慮一下,在UITableView的封面之下,有五個單元正在重用。
對於上述每個呼叫,將發生以下情況:
cellForRowAtIndexPath:(0,1)為數組中的對象提供索引1,即a.png -您嘗試使現有單元出隊,但它返回“ nil”,因此您創建了一個新單元。 您設置模型對象的詳細信息。
cellForRowAtIndexPath:(0,2)為數組中的對象提供索引2,即a.png -您嘗試使現有單元出隊,但它返回“ nil”,因此您創建了一個新單元。 您設置模型對象的詳細信息。
cellForRowAtIndexPath:(0,3)為數組中的對象提供索引3,即a.png -您嘗試使現有單元出隊,但它返回“ nil”,因此您創建了一個新單元。 您設置模型對象的詳細信息。
cellForRowAtIndexPath:(0,4)為數組中的對象提供索引4,即a.png -您嘗試使現有單元出隊,但它返回“ nil”,因此您創建了一個新單元。 您設置模型對象的詳細信息。
cellForRowAtIndexPath:(0,5)為數組中的對象提供索引5,即b.png -您嘗試使現有單元出隊,並且可以工作! 您可以通過設置模型對象的詳細信息來再次使用該單元格
cellForRowAtIndexPath:(0,6)為數組中的對象提供索引為6的索引,即b.png -您嘗試使現有單元出隊,並且可以正常工作! 您可以通過設置模型對象的詳細信息來再次使用該單元格
cellForRowAtIndexPath:(0,7)為數組中的對象提供索引7,它是b.png -您嘗試使現有單元出隊,並且可以正常工作! 您可以通過設置模型對象的詳細信息來再次使用該單元格
cellForRowAtIndexPath:(0,8)為數組中的對象提供索引8,即b.png -您嘗試使現有單元出隊,並且可以工作! 您可以通過設置模型對象的詳細信息來再次使用該單元格
cellForRowAtIndexPath:(0,9)為數組中的對象提供索引9,該索引為b.png -您嘗試使現有單元出隊,並且可以正常工作! 您可以通過設置模型對象的詳細信息來再次使用該單元格
很抱歉這么冗長! 我希望這有幫助。 也許值得通過一個好的表格視圖教程來工作。 肯定會有很多。
嘗試更改單元格的標識符值。
NSString* identifierStr = [NSString stringWithFormat:@"ident_%d",indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifierStr];
您可能在創建單元實例時添加圖像,而不是在表視圖要求提供單元視圖時添加圖像。 例:
這是正確的方法。 每當表格視圖要求一個單元格時,我們都會設置圖像。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ident"];
UIImageView *imageView;
if (cell == nil) {
cell = [UITableViewCell alloc] init ....];
imageView = [[UIIMageView alloc] init];
imageView.tag = 123;
[cell addSubview:imageView];
[imageView release];
} else {
imageView = [cell viewWithTag:123];
}
imageView.image = ...; // load image here
}
這是錯誤的方式。 我們在創建單元格時設置圖像。 這將導致單元格在重新使用時具有錯誤的圖像。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ident"];
if (cell == nil) {
cell = [UITableViewCell alloc] init ....];
UIImageView *imageView = [[UIIMageView alloc] init];
imageView.image = ...;
[cell addSubview:imageView];
[imageView release];
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.