这是我的cellForRowAtIndexPath UITableView委托方法的删节代码:
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"blahblahblah"];
if (cell == nil) {
// No cell to reuse => create a new one
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"blahblahblah"] autorelease];
}
cell.textLabel.text = @"";
cell.detailTextLabel.text = @"";
cell.backgroundView = NULL; //problem here
// Initialize cell
//blah blah blah
//now to the good part...
if(indexPath.section == 1) {
cell.backgroundView = deleteButton;
cell.userInteractionEnabled = YES;
cell.textLabel.text = nil;
cell.detailTextLabel.text = nil;
}
else if(indexPath.section == 0) {
NSLog(@"section: %i row: %i", indexPath.section, indexPath.row);
switch (indexPath.row) {
case 0:
cell.textLabel.text = @"foobar";
//more stuff
break;
//lots more cases
default:
break;
}
}
return cell;
}
我的问题是第1部分中的第一个单元格(第0部分有10个单元格,第1部分只有1个单元格)被分配了仅应该分配给第一部分的单元格0的信息。因此,它不是获取deleteButton背景等,而是获得标签标题“foobar”。我不确定为什么会发生这种情况,因为我的if语句很清楚。有什么想法吗?
编辑:将backgroundView设置为NULL会导致带有文本的单元格在离开视图时返回时没有任何背景。所以这不是一个可行的解决方案。此外,detailTextLabel的文本仍设置在不应有任何文本的单元格上。
它的外观如下,单元格backgroundViews设置为nil,文本显示在删除单元格中,不应该出现:
解决方案,按照Alex Deem的建议(用此代码替换旧的出列代码):
NSString* identifier;
if(indexPath.section == 0)
identifier = @"0";
else
identifier = @"1";
UISwitch *switchView;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
// No cell to reuse => create a new one
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier] autorelease];
答案 0 :(得分:5)
您应该阅读有关重复使用单元格的文档。
您应该为这两个部分中的每个部分使用不同的reuseIdentifier,因为它们是根本上不同样式的单元格。
答案 1 :(得分:0)
在这些代码行中添加一个结束}
括号:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"blahblahblah"];
if (cell == nil) {
// No cell to reuse => create a new one
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"blahblahblah"] autorelease];
}
....
....
....
if(indexPath.section == 1) {
....
....
}
if(indexPath.section == 0) {
....
....
}
我怀疑你的表会有更好的结果。
现在的工作方式(至少在我的代码中可以告诉你),你创建了一个单元格,它被初始化为某个东西。它永远不会重置为值和&其他任何要求的数据。
答案 2 :(得分:0)
您的代码结构错误。
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"blahblahblah"];
if (cell == nil)
如果不再使用,则dqueueReuseableCellWithIdentifier将返回先前创建的现有单元格。 If cell == nil
您应该创建一个新单元格并设置所有单元格共有的默认值。但是,该索引路径的任何数据设置都应在
if(cell==nil) block.
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"blahblahblah"];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"blahblahblah"] autorelease];
}
cell.textLabel.text=@"unique text";
return cell;