簡體   English   中英

UITableView滾動問題

[英]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.

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