如何将特定 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 中选择特定索引并存储在 nsarray [关闭]
如何将json数据中的对象添加到nsmutablearray?