我已经阅读了很多问题并尝试了解决方案,但我仍然无法使用tableview
解决问题。
滚动后,tableview行中的数据互换,有时会丢失。
这是我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *modifierCheckCell = @"BGMModifierCheckCell";
BGMModifierCheckCell *cell = nil;
cell = (BGMModifierCheckCell *)[tableView dequeueReusableCellWithIdentifier:modifierCheckCell];
if (cell == nil) {
NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:modifierCheckCell owner:self options:nil];
for (id currentObject in topLevelObjects) {
if ([currentObject isKindOfClass:[UITableViewCell class]]) {
cell = (BGMModifierCheckCell *)currentObject;
break;
}
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
NSArray *optionIds = [[[arrayInsideDict objectAtIndex:indexPath.section] objectForKey:@"optnItem"] objectAtIndex:indexPath.row];
BGMOptnCats *optnCat = [BGMOptnCats MR_findFirstByAttribute:@"iOptnCatId" withValue:[[arrayInsideDict objectAtIndex:indexPath.section] objectForKey:@"optnCatId"]];
[optionIds enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
__block int optnTag = [obj intValue];
BGMItemDayOptns *item = [BGMItemDayOptns MR_findFirstByAttribute:@"iItemDayOptnId" withValue:obj];
[item.optns.optnLangs enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
BGMOptnLangs *lang = (BGMOptnLangs *)obj;
if ([lang.sLangCode isEqualToString:@"en"]) {
NSString *optn = [NSString stringWithFormat:@"%@", lang.sOptnName];
if ([optnCat.sOptnType isEqualToString:@"single"]) {
RadioButton *rb1 = [[RadioButton alloc] initWithFrame:CGRectMake(0, 0, 200, 40)];
[rb1 setGroupID:indexPath.section AndID:optnTag AndTitle:optn];
rb1.delegate = self;
if (idx == 0) {
[cell.firstOption addSubview:rb1];
} else if (idx == 1) {
[cell.secondOption addSubview:rb1];
} else if (idx == 2) {
[cell.thirdOption addSubview:rb1];
}
} else if ([optnCat.sOptnType isEqualToString:@"multiple"]) {
SSCheckBoxView *checkBox = [[SSCheckBoxView alloc] initWithFrame:CGRectMake(0, 0, 200, 40) style:kSSCheckBoxViewStyleMono checked:NO];
checkBox.tag = optnTag;
[checkBox setStateChangedTarget:self selector:@selector(checkBoxViewChangedState:)];
[checkBox setText:@""];
[checkBox setText:optn];
if (idx == 0) {
[cell.firstOption addSubview:checkBox];
} else if (idx == 1) {
[cell.secondOption addSubview:checkBox];
} else if (idx == 2) {
[cell.thirdOption addSubview:checkBox];
}
}
}
}];
}];
}
return cell;
}
答案 0 :(得分:1)
问题是您的细胞正在被重复使用。因此滚动时行会互换。
将单元格内容设置在if(cell == nil)之外。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *modifierCheckCell = @"BGMModifierCheckCell"; BGMModifierCheckCell *cell = nil; cell = (BGMModifierCheckCell *)[tableView dequeueReusableCellWithIdentifier:modifierCheckCell]; if (cell == nil) { NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:modifierCheckCell owner:self options:nil]; for (id currentObject in topLevelObjects) { if ([currentObject isKindOfClass:[UITableViewCell class]]) { cell = (BGMModifierCheckCell *)currentObject; break; } } } cell.selectionStyle = UITableViewCellSelectionStyleNone; NSArray *optionIds = [[[arrayInsideDict objectAtIndex:indexPath.section] objectForKey:@"optnItem"] objectAtIndex:indexPath.row]; BGMOptnCats *optnCat = [BGMOptnCats MR_findFirstByAttribute:@"iOptnCatId" withValue:[[arrayInsideDict objectAtIndex:indexPath.section] objectForKey:@"optnCatId"]]; [optionIds enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { __block int optnTag = [obj intValue]; BGMItemDayOptns *item = [BGMItemDayOptns MR_findFirstByAttribute:@"iItemDayOptnId" withValue:obj]; [item.optns.optnLangs enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { BGMOptnLangs *lang = (BGMOptnLangs *)obj; if ([lang.sLangCode isEqualToString:@"en"]) { NSString *optn = [NSString stringWithFormat:@"%@", lang.sOptnName]; if ([optnCat.sOptnType isEqualToString:@"single"]) { RadioButton *rb1 = [[RadioButton alloc] initWithFrame:CGRectMake(0, 0, 200, 40)]; [rb1 setGroupID:indexPath.section AndID:optnTag AndTitle:optn]; rb1.delegate = self; if (idx == 0) { [cell.firstOption addSubview:rb1]; } else if (idx == 1) { [cell.secondOption addSubview:rb1]; } else if (idx == 2) { [cell.thirdOption addSubview:rb1]; } } else if ([optnCat.sOptnType isEqualToString:@"multiple"]) { SSCheckBoxView *checkBox = [[SSCheckBoxView alloc] initWithFrame:CGRectMake(0, 0, 200, 40) style:kSSCheckBoxViewStyleMono checked:NO]; checkBox.tag = optnTag; [checkBox setStateChangedTarget:self selector:@selector(checkBoxViewChangedState:)]; [checkBox setText:@""]; [checkBox setText:optn]; if (idx == 0) { [cell.firstOption addSubview:checkBox]; } else if (idx == 1) { [cell.secondOption addSubview:checkBox]; } else if (idx == 2) { [cell.thirdOption addSubview:checkBox]; } } } }]; }]; return cell; }
答案 1 :(得分:0)
你需要删除你的子视图,因为每次调用CellForRowAtIndexpath时它都会创建一个子视图,所以在添加新的子视图之前删除前一个子视图
for (UIView *view in cell.contentView.subviews) {
[view removeFromSuperview];
}