滚动后,表格视图单元格的内容会发生变化

时间:2015-08-05 03:59:21

标签: ios objective-c uitableview

我正在使用xib并创建了一个UITableViewController。在我的cellForRowAtIndex中,我出列并设置了一个自定义表格单元格,如下所示:

 CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomTableViewCell" forIndexPath:indexPath];
 cell.delegate = self;

然后我设置了一些条件来设置单元格。我做了这样的事情:

 if (indexPath.row == 2 || indexPath.row == 5) {
    cell.addressLabel.hidden = YES;
 } else {
     cell.storeHourTitle.text = [[[self.dict objectForKey:@"Hours"] objectAtIndex:indexPath.row] objectAtIndex:0];
     cell.addressLabel.hidden = NO;
 }

为了显示更多信息,我的heightForRowAtIndexPath有:

  if (indexPath.row == 2 || indexPath.row == 5) {
        return 280;
  } else {
        return 520;
  }

我也设置了:

self.tableView.delegate = self
self.tableView.datasource = self

但我不认为这是必要的?因为我使用的是UITableViewController,请为我验证。

所以现在当我运行我的应用程序时,单元格正确加载,至少是前5页。一旦我向下滚动,第5行的内容不正确,当我向上滚动时,一些内容会发生变化。 (例如,第一个单元格的内容成为最后一个单元格(行= 6))

我只在我的numberOfRowsInSection中返回6。

我没有正确地将细胞出列吗?据我所知,如果我使用

dequeueReusableCellWithIdentifier forIndexPath

我不需要做

if (cell == nil) 

因为它总会返回一些东西。如果你们发现我的UITableView逻辑中有任何缺陷,请指出给我,谢谢!

编辑:

更详细的代码cellForRowAtIndexPath

CustomStoreTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomStoreTableViewCell" forIndexPath:indexPath];

cell.delegate = self;
if (indexPath.row == 2 || indexPath.row == 6) {

    cell.operatingHoursLabel.hidden = YES;
    cell.operatingHoursLabel2.hidden = YES;
    cell.addressLabel.hidden = YES;
    cell.numberLabel.hidden = YES;

    cell.storeHourTitle.text = [[[self.dict objectForKey:@"Hours"] objectAtIndex:indexPath.row] objectAtIndex:0];
    cell.storeHourTitle.textColor = [UIColor blackColor];
    cell.addressTitle.hidden = YES;
    cell.phoneTitle.hidden = YES;
    cell.emailTitle.hidden = YES;
    cell.emailLabel.hidden = YES;

}
else{

    cell.topImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@",[[self.dict objectForKey:@"Picture"] objectAtIndex:indexPath.row]]];
    cell.operatingHoursLabel.text = [[[self.dict objectForKey:@"Hours"] objectAtIndex:indexPath.row] objectAtIndex:0];
    cell.operatingHoursLabel2.text = [[[self.dict objectForKey:@"Hours"] objectAtIndex:indexPath.row] objectAtIndex:1];

    cell.addressLabel.text = [[self.dict objectForKey:@"Address"] objectAtIndex:indexPath.row] ;
    cell.addressLabel.numberOfLines = 0;
    cell.numberLabel.text = [[self.dict objectForKey:@"Phone"] objectAtIndex:indexPath.row];
}
return cell;

2 个答案:

答案 0 :(得分:4)

首先,如果您使用UITableViewController,则不需要设置数据源和委托。但如果你这样做,没有什么不好的事情发生;)

如果您在滚动tableView后看到奇怪的事情,那么cellForRowAtIndexPath:方法绝对有问题。在大多数情况下,您有条件地设置某些内容并忘记设置或重置else条件的单元格。或者,您是否有自定义单元格(在xib中定义的单元格)或已实现自定义单元格控制器?在这种情况下,使用prepareForReuse方法进行清理工作。 (我猜你是,因为你正在为细胞设置代表,这意味着你的细胞中正在发生一些事情)

但是对于您一直要求的缺陷,我只希望您已将单元格的delegate属性定义为weak,否则会导致内存泄漏。

发布cellForRowAtIndexPath后,我现在很清楚,您在if语句中设置了一些值,但忘记将它们设置为else语句中的其他值。你应该总是对着你出列的单元格对称地设置值,否则它们会保持旧的值在过去随意设置!

它可能是这样的:

CustomStoreTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomStoreTableViewCell" forIndexPath:indexPath];

cell.delegate = self;
if (indexPath.row == 2 || indexPath.row == 6) {

    cell.operatingHoursLabel.hidden = YES;
    cell.operatingHoursLabel2.hidden = YES;
    cell.addressLabel.hidden = YES;
    cell.numberLabel.hidden = YES;

    cell.storeHourTitle.text = [[[self.dict objectForKey:@"Hours"] objectAtIndex:indexPath.row] objectAtIndex:0];
    cell.storeHourTitle.textColor = [UIColor blackColor];
    cell.addressTitle.hidden = YES;
    cell.phoneTitle.hidden = YES;
    cell.emailTitle.hidden = YES;
    cell.emailLabel.hidden = YES;

}
else{
cell.operatingHoursLabel.hidden = NO;
    cell.operatingHoursLabel2.hidden = NO;
    cell.addressLabel.hidden = NO;
    cell.numberLabel.hidden = NO;
    cell.addressTitle.hidden = NO;
    cell.phoneTitle.hidden = NO;
    cell.emailTitle.hidden = NO;
    cell.emailLabel.hidden = NO;
    cell.topImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@",[[self.dict objectForKey:@"Picture"] objectAtIndex:indexPath.row]]];
    cell.operatingHoursLabel.text = [[[self.dict objectForKey:@"Hours"] objectAtIndex:indexPath.row] objectAtIndex:0];
    cell.operatingHoursLabel2.text = [[[self.dict objectForKey:@"Hours"] objectAtIndex:indexPath.row] objectAtIndex:1];

    cell.addressLabel.text = [[self.dict objectForKey:@"Address"] objectAtIndex:indexPath.row] ;
    cell.addressLabel.numberOfLines = 0;
    cell.numberLabel.text = [[self.dict objectForKey:@"Phone"] objectAtIndex:indexPath.row];
}
return cell;

答案 1 :(得分:1)

您的代码就像这样

CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomTableViewCell" forIndexPath:indexPath];
 cell.delegate = self;

将此代码更改为此

CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomTableViewCell"];

您为表而不是单元格设置委托。