Objective C - 使用NSMutableArray清空和重新加载UITableViewController的正确方法

时间:2012-03-14 19:39:34

标签: objective-c nsmutablearray uitableview reloaddata

我有一个UITableViewController,它使用NSMutableArray作为它的数据源。最初通过调用Web服务来检索数据并填充NSMutableArray,从而在viewDidLoad方法中填充该数组。然后,用户可以选择输入搜索词(在UISearchBar中),然后按搜索以重新运行Web服务并重新填充表列表。此时我需要清空数组并从Web服务的结果中重新填充表。我的问题是如何在不破坏重新绘制表视图的情况下执行此操作的正确方法是什么?我可以看到两个选项:

  1. 调用[listArray removeAllObjects];然后[[self tableView] reloadData];在重新填充数组之前。

  2. 由于我将列表限制为最多200行,使用200项初始化数组,然后在运行搜索时不使用删除和重新添加,而是使用[listArray replaceObjectAtIndex:替换每一行。这将需要一个int变量来保持返回的行数,并在'tableView numberOfRowsInSection'方法中使用它,这样tableview只显示返回的行数。

  3. 希望有道理!我问这个问题,因为我在重新加载列表时遇到了一些间歇性错误(EXC_BAD_ACCESS),我确信这与我如何清空和重新加载列表有关,所以可以使用一些关于最佳方法的建议

    任何帮助表示赞赏,

    乔纳森

    更新:

    在viewDidLoad中初始化数组的代码:

    tableListDataArray = [[NSMutableArray alloc] init];
    

    检索数据后,会按如下方式将其添加到数组中:

    CustSuppListItem *custSuppItem = [[CustSuppListItem alloc] init];
    [custSuppItem setAcCode:[jsonCustSuppRecord getStringForKey:@"acCode"]];
    [custSuppItem setAcCompany:[jsonCustSuppRecord getStringForKey:@"acCompany"]];
    [custSuppItem setAcContact:[jsonCustSuppRecord getStringForKey:@"acContact"]];
    [custSuppItem setOsBalBase:[jsonCustSuppRecord getDoubleForKey:@"osBalBase"]];
    [custSuppItem setAcAccStatus:[jsonCustSuppRecord getIntForKey:@"acAccStatus"]];                             
    [tableListDataArray addObject:custSuppItem];                          
    [custSuppItem release];
    

    该数组在dealloc方法中发布如下:

    [tableListDataArray release];
    

1 个答案:

答案 0 :(得分:2)

我个人会选择选项1.你应该能够使用

[tableView reloadData]

没有“自我”。 reloadData也会调用我相信的cellForRowAtIndexPath方法 在使用之前不要忘记初始化NSMutableArray。

myMutableArray  = [[NSMutableArray alloc] initWithCapacity:9001];