如何将特定 NSMutableArray 中的数据重新加载到 UITableView

Posted

技术标签:

【中文标题】如何将特定 NSMutableArray 中的数据重新加载到 UITableView【英文标题】:How to reload data from a specific NSMutableArray into a UITableView 【发布时间】:2014-03-26 14:37:19 【问题描述】:

您好,我正在使用返回 JSON 文档的 Web 服务。在该文档中有几个对象,每个对象都包含一个“STATE”值(其中包括“ADDRESS”、“DISTANCE”等)。此“STATE”值可以是“ARCHIVED”或“ACTIVE”。我想要做的是将具有“STATE”的“ARCHIVED”值的对象加载到archivedProcessTV中,将其他对象加载到activeProcessTV中。

我设法用所需数据填充了两个可变数组,但是当 TableView 重新加载时,它们会将所有对象重新加载到单元格中。

这是我在 connectionDidFinishLoading 上所做的事情:

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

NSLog(@"Entrou no connectionDidFinishLoading");

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

process = [[NSJSONSerialization JSONObjectWithData:data options:0 error:nil] objectForKey:@"GetGesturbeDataJsonResult"];

NSInteger i = 0;

archived = [[NSMutableArray alloc] init];
active = [[NSMutableArray alloc] init];

for (NSObject *array1 in process) 
    while (i <= process.count) 
    if([[[process objectAtIndex:i] objectForKey:@"STATE" ] isEqualToString:@"ARCHIVED"])
        
            [archived addObject:[process objectAtIndex:i]];
            i++;
        else
            [active addObject:[process objectAtIndex:i]];
            i++;
    


[activeProcessTV reloadData];
[archivedProcessTV reloadData];

感谢您的帮助!

编辑:

-(UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

UITableViewCell *cell = [atableView dequeueReusableCellWithIdentifier:@"a cell"];
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"a cell"];

cell.textLabel.text = [[process objectAtIndex:indexPath.row] objectForKey:@"DISTANCE"];

return cell;

【问题讨论】:

显示你的表格视图数据源方法实现 @Wain 我不知道你的意思是不是我刚刚添加到问题中的内容。 (抱歉无知) 您是否在某处合并这两个数组(活动和存档)并将所有值混合在一起? @Justafinger 不,我不这么认为 【参考方案1】:

您似乎有两个问题:

    tableView:cellForRowAtIndexPath: 不检查哪个表视图正在请求数据 您不使用特定的数组内容来填充表格视图,而是使用包含所有数据的 [[process objectAtIndex:indexPath.row] objectForKey:@"DISTANCE"];

因此,在tableView:cellForRowAtIndexPath: 的开头,您应该有一个if 语句来检查atableView 参数并决定使用哪个数组。然后,编辑更新单元格文本的行以使用该数组。

- (UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    NSArray *sourceArray;

    if (atableView == self.activeProcessTV) 
        sourceArray = self.active;
     else 
        sourceArray = self.archived;
    

    UITableViewCell *cell = [atableView dequeueReusableCellWithIdentifier:@"a cell"];
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"a cell"];
    

    cell.textLabel.text = [[sourceArray objectAtIndex:indexPath.row] objectForKey:@"DISTANCE"];

    return cell;


旁白:这段代码:

UITableViewCell *cell = [atableView dequeueReusableCellWithIdentifier:@"a cell"];
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"a cell"];

需要改成:

UITableViewCell *cell = [atableView dequeueReusableCellWithIdentifier:@"a cell"];
if (cell == nil) 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"a cell"];

目前您总是在创建一个新单元格,即使您确实得到了一个可重复使用的单元格...

【讨论】:

我已经按照你的建议编辑了代码,它给了我这个错误:由于未捕获的异常'NSRangeException'而终止应用程序,原因:'***-[__NSArrayM objectAtIndex:]:超出索引 1界限 [0 .. 0]' Wain,你需要初始化源数组。否则它将永远为零?? @HussainShabbir sourceArray 指向 self.active 或 self.archived 并且永远不会为空,除非后两者未初始化。 谢谢@Wain,你的帮助很宝贵!【参考方案2】:

尽管使用了 sourcearray,但只需像下面这样通过并检查:-

-(UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

UITableViewCell *cell = [atableView dequeueReusableCellWithIdentifier:@"a cell"];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"a cell"];

if ( atableView ==self.activeProcessTV) 
cell.textLabel.text = [[self.activeProcessTV objectAtIndex:indexPath.row] objectForKey:@"DISTANCE"];

else
cell.textLabel.text = [[self.archived objectAtIndex:indexPath.row] objectForKey:@"DISTANCE"];

return cell;

注意:在 UITableView 的 numberOfRowsInSection 方法中传递正确的数组计数。

【讨论】:

问题仍然存在,它给出了错误:由于未捕获的异常'NSRangeException'而终止应用程序,原因:'*** - [__NSArrayM objectAtIndex:]:索引1超出范围[0 .. 0] ' 你检查你的数组不是 nil 吗?? 你在 UITableView 的 numberOfRowsInSectionn 方法中返回了什么?? 我已经更正了,它相应地返回了 process.count 而不是 active.count 或 archived.count!谢谢!

以上是关于如何将特定 NSMutableArray 中的数据重新加载到 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

在 NSMutableArray 的特定索引处添加对象

如何在 NSMutableArray 中选择特定索引并存储在 nsarray [关闭]

如何将json数据中的对象添加到nsmutablearray?

如何访问 NSMutableArray 中的 JSON 数据?

如何获取 NSMutableArray 特定对象

如何在 NSMutableArray 上添加观察者?