我在XIB
didSelectRowAtIndexPath
期间加载了展开的单元格tableView
。现在,当每个单元格展开时,我都会调用一个webservice。根据它的响应,我加载{{1在扩展的单元格中。现在问题是数据在某些单元格中是可见的而在其他单元格中是不是?我不完全确定childViewController
即重新使用的单元格是否会导致这样的问题。但如果是这样,我该如何解决问题?< / p>
dequeueReusableCellWithIdentifier
答案 0 :(得分:0)
修改您的代码,如下所示。如果条件允许,你需要首先返回.. 你在if(!isExpanded)条件下返回nil。修复如下
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier = @"Cell";
static NSString *expandedCellIdentifier = @"ExpandedCell";
if (!isExpanded) {
ListCell *cell =(ListCell*) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell==nil) {
NSArray *nibs = [[NSBundle mainBundle]loadNibNamed:@"ListCell" owner:self options:nil];
cell = nibs[0];
}
cell.Name.text = [[bArray objectAtIndex:indexPath.row]valueForKey:@"opName"];
return cell;
}
else
{
expCell = (ExpandedCell*)[tableView dequeueReusableCellWithIdentifier:expandedCellIdentifier];
if (expCell==nil)
{
NSArray *nibs = [[NSBundle mainBundle]loadNibNamed:@"ExpandedCell" owner:self options:nil];
expCell = nibs[0];
}
UILabel *endLabel = (UILabel *)[expCell.background_View viewWithTag:102];
endLabel.text = [NSString stringWithFormat:@"%@",endStn.capitalizedString];
return expCell;
}
return nil;
}
希望它可以帮助你..
答案 1 :(得分:0)
你对didSelectRow中的单元格所做的任何操作都是可疑的,尤其是你异步执行的操作。用户滚动时,这些单元格会进出。当单元格在另一个indexPath中重用时,您直接对单元格进行的状态更改将显示在其他位置。
相反,您应该遵循的模式是:(1)用户采取行动,(2)行动改变模型,(3)模型改变导致表更新,(4)表更新读取模型。
在这种情况下,这意味着此代码......
[self callWebservice completionBlock:^(BOOL finished){
if (finished) {
[self initialseChildViewController:^(BOOL finished){
if (finished) {
[self populateView:^(BOOL finished){
...不应该引用任何表格单元格(既不在方法中也不在完成块中)。您发布的唯一单元格修改代码位于下一行:
if (expCell.expContainer.hidden==YES) {
expCell.expContainer.hidden=NO;
}
......甚至那些必须改变。无论你正在为小区做什么,都必须在cellForRowAtIndexPath中完成。在模型中记下这个indexPath上单元格的expContainer的隐藏状态必须改变(不确定你的项目中是否等同于添加到expandedCells集合),然后在此indexPath处重新加载行。
重述规则:仅更改cellForRowAtIndexPath中的单元格。根据模型(也称为数据源数组)更改这些单元格。如果模型中的信息不足以告诉您如何配置单元格,那么您的模型缺少某些内容...将其添加到模型中。然后,当你想对表格单元格做任何事情时,不要这样做。对你的模型做一些事情,然后重新加载表的那一部分。