当单元格扩展时,UITableView单元格不会在某些单元格中显示数据

时间:2014-09-15 14:37:05

标签: ios objective-c uitableview

我在XIB didSelectRowAtIndexPath期间加载了展开的单元格tableView。现在,当每个单元格展开时,我都会调用一个webservice。根据它的响应,我加载{{1在扩展的单元格中。现在问题是数据在某些单元格中是可见的而在其他单元格中是不是?我不完全确定childViewController重新使用的单元格是否会导致这样的问题。但如果是这样,我该如何解决问题?< / p>

dequeueReusableCellWithIdentifier

2 个答案:

答案 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中的单元格。根据模型(也称为数据源数组)更改这些单元格。如果模型中的信息不足以告诉您如何配置单元格,那么您的模型缺少某些内容...将其添加到模型中。然后,当你想对表格单元格做任何事情时,不要这样做。对你的模型做一些事情,然后重新加载表的那一部分。