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