繁体   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