要理解的关键是您的表格单元格被重复使用。这样做是为了提高滚动性能,因为创建一个新单元格(即视图)非常昂贵。
在方法 cellForRowAtIndexPath 中,您返回一个单元格。使用 dequeue 方法的现有单元格,或者创建一个新单元格。在该单元格上,您可以设置要表示的任何内容的所有属性。
我的猜测是您直接在单元格上设置这些属性,例如图像等。然后,当您滚动时,该单元格会被重复使用,您会再次看到相同的图像,但在错误的单元格上。
因此,您需要一个单独的索引(如 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 的对象,即 a.png
cellForRowAtIndexPath:(0,4) 提供数组中的对象索引为 4,即 a.png
cellForRowAtIndexPath:(0,5) 提供数组中的对象索引为 5,即 b.png
cellForRowAtIndexPath:(0,6) 提供数组中的对象 a 索引 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
-- 您尝试将现有单元格出列并且它有效!您可以通过设置模型对象的详细信息再次使用该单元格
抱歉这么啰嗦!我希望这有帮助。也许值得通过一个好的表格视图教程来学习。肯定会有很多。