UITableView + NSMutableArray 奇怪的行为

Posted

技术标签:

【中文标题】UITableView + NSMutableArray 奇怪的行为【英文标题】:UITableView + NSMutableArray weird behavior 【发布时间】:2010-07-20 15:00:36 【问题描述】:

我目前正在尝试从从 Internet 下载的 plist 中填充 UITableView。 plist 被加载到 NSMutableArray 中,然后保存为文件,效果很好。

当我尝试用它填充我的 UITableView 时,我遇到了麻烦。

UITableView 仅显示 *plist 文件中的前 8 个条目(但有 98 个),然后循环遍历它们直到达到 98,因此它始终是相同的 8 个条目而不是 98 个不同的条目。

这是我的日志:

2010-07-20 15:50:19.064 myCustomers[15221:207] New Cell
2010-07-20 15:50:19.065 myCustomers[15221:207] Bob
2010-07-20 15:50:19.068 myCustomers[15221:207] New Cell
2010-07-20 15:50:19.069 myCustomers[15221:207] Jo
2010-07-20 15:50:19.071 myCustomers[15221:207] New Cell
2010-07-20 15:50:19.071 myCustomers[15221:207] Neil
2010-07-20 15:50:19.075 myCustomers[15221:207] New Cell
2010-07-20 15:50:19.075 myCustomers[15221:207] Robert
2010-07-20 15:50:19.077 myCustomers[15221:207] New Cell
2010-07-20 15:50:19.078 myCustomers[15221:207] Jack
2010-07-20 15:50:19.079 myCustomers[15221:207] New Cell
2010-07-20 15:50:19.080 myCustomers[15221:207] John
2010-07-20 15:50:19.081 myCustomers[15221:207] New Cell
2010-07-20 15:50:19.082 myCustomers[15221:207] Ralph
2010-07-20 15:50:19.083 myCustomers[15221:207] New Cell
2010-07-20 15:50:19.084 myCustomers[15221:207] Bart

它会创建新的单元格,然后在 8 处停止并循环。 :/

以下是我创建单元格并获取数组数据的方法:

if (tableView == myTable)

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) 
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

if (indexPath.section == 0) 

cell.textLabel.text = [self.dataForTable objectAtIndex:indexPath.row];
    NSLog(@"New Cell");
    NSLog(@"%@",[self.dataForTable objectAtIndex:indexPath.row]);


return cell;

NSMutableArray "dataForTable" 是这样创建的:

if ([[[NSMutableArray alloc] initWithContentsOfFile:fullFileName] autorelease] != nil)
    
    self.dataForTable = [[[NSMutableArray alloc] initWithContentsOfFile:fullFileName] autorelease];
    
    else 
    
        self.dataForTable = [[NSMutableArray alloc] init]; //create a brand new array if there is no entries file.
    

数组的数据很好,我在日志中检查了这个,所有 98 个条目都显示在那里,但表格视图只会使用 8 个。

我一直找不到解决办法,谁能帮帮我?

谢谢!

【问题讨论】:

我不确定,但我认为这是因为一个屏幕上只能显示 8 个单元格。 错了,这是因为他在重复使用表格单元格。您在创建单元之后 为每个单元设置文本,如下面的 Vladimir 所示。否则,最初创建的 8 个单元格永远不会更新新内容,而只会显示它们最初初始化的内容。 【参考方案1】:

在您的 cellForRowAtIndexPath: 方法中,您仅在创建单元格的新实例时才设置单元格。虽然 UITableView 为行重用单元格(即,隐藏行的单元格用于变为可见的行)并且您每次都需要为您的行设置单元格 - 因此您应该将代码更改为:

... 
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];


if (indexPath.section == 0) 

    cell.textLabel.text = [self.dataForTable objectAtIndex:indexPath.row];
    NSLog(@"New Cell");
    NSLog(@"%@",[self.dataForTable objectAtIndex:indexPath.row]);


return cell;

【讨论】:

以上是关于UITableView + NSMutableArray 奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 .plist 文件填充表格视图?

如何将@IBAction func 数据放入 TableView?

Parse.com 查询 10000 (10K) 个对象

iOS界面跳转

iOS:动态创建并分配名称给 UIControl

连接 UITableView + UITableView