我已经阅读了很多问题并尝试了解决方案,但我的 tableview 仍然无法解决问题。
滚动后,tableview 的行中的数据会互换,有时会丢失。
这是我的代码:
- (UITableViewCell *)tableViewUITableView *)tableView cellForRowAtIndexPathNSIndexPath *)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" withValuebj];
[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 AndIDptnTag AndTitleptn];
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 selectorselector(checkBoxViewChangedState];
[checkBox setText""];
[checkBox setTextptn];
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;
}
Best Answer-推荐答案 strong>
问题是您的单元格正在被重复使用。所以滚动时行会互换。
在 if (cell == nil) 之外设置单元格内容。
- (UITableViewCell *)tableViewUITableView *)tableView cellForRowAtIndexPathNSIndexPath *)indexPath
{
静态 NSString *modifierCheckCell = @"BGMModifierCheckCell";
BGMModifierCheckCell *cell = nil;
cell = (BGMModifierCheckCell *)[tableView dequeueReusableCellWithIdentifier:modifierCheckCell];
如果(细胞 == 零){
NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:modifierCheckCell owner:self options:nil];
for (id currentObject in topLevelObjects) {
if ([currentObject isKindOfClass:[UITableViewCell 类]]) {
单元格 = (BGMModifierCheckCell *)currentObject;
休息;
}
}
}
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"withValuebj];
[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 AndIDptnTag AndTitleptn];
rb1.delegate = self ;
如果(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) 样式:kSSCheckBoxViewStyleMono 选中:NO];
checkBox.tag = optnTag;
[checkBox setStateChangedTarget:self 选择器:@selector(checkBoxViewChangedState];
[复选框 setText:@""];
[复选框 setTextptn];
如果(idx == 0){
[cell.firstOption addSubview:checkBox];
} else if (idx == 1) {
[cell.secondOption addSubview:checkBox];
} else if (idx == 2) {
[cell.thirdOption addSubview:checkBox];
}
}
}
}];
}];
返回单元格;
}
关于ios - 滚动后tableview内的数据混淆了,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/18777530/
|