我正在使用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;
答案 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"];
您为表而不是单元格设置委托。