我有一个4行的分组tableView。我对两个视图之间的操作进行了相当大的改革,现在reloadData表现得很奇怪。它只会刷新一行数据。 (最后一个)而不是其他人。
我在viewDidAppear方法(我调用reloadData)中检查了我的值,并更新了所有值。
代码..
- (void)viewDidAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// reload the table data
[self.tableView reloadData];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Set up the cell...
static NSString *CellWithIdentifier = @"Cell";
UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellWithIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellWithIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.textLabel.text = [_tableGroup.options objectAtIndex:rowcount];
cell.tag = rowcount;
rowcount++;
//label for currently selected/saved setting
_currentSetting = [[BaseLabel alloc] initWithFrame:CGRectMake(160, 8, 115, 25)];
[_currentSetting setFont:[UIFont systemFontOfSize:14]];
_currentSetting.backgroundColor = [UIColor clearColor];
_currentSetting.textColor = [UIColor blueColor];
_currentSetting.textAlignment = NSTextAlignmentRight;
}
if (cell.tag == 0) {
_currentSetting.text = [NSString stringWithFormat:@"%@ mi",[settings.val1 stringValue]];
}
else if(cell.tag == 1)
{
_currentSetting.text = [NSString stringWithFormat:@"%@ items",[settings.val2 stringValue]];
}
else if(cell.tag == 2)
{
_currentSetting.text = [NSString stringWithFormat:@"%@ items",[settings.val3 stringValue]];
}
[cell.contentView addSubview:_currentSetting];
return cell;
}
我已经完成了NSLog,并且所有内容都被调用,因为它应该在reloadData上调用,但是单元格没有更改它们的标签。为什么呢?
答案 0 :(得分:3)
我在这里可以看到的主要问题是:
cell.tag = rowcount;
rowcount++;
在 if(cell == nil)中,cell.tag不能出现,你应该把它取出来。相反,你不应该检查cell.tag来设置currentSettingText,你应该使用indexPath.row
同样在每个viewDidAppear中,当你重新加载Table时,会调用cellForRowAtIndexPath,每次都会递增rowCount,从而递增cell.tag,你在哪里重置它?
答案 1 :(得分:3)
问题1: cellForRowAtIndexPath需要通过获取现有单元格,或者通过创建单元格并添加子视图(仅在创建单元格时)来返回单元格。当我们有一个现有的单元格时,我们可以假设它已经添加了子视图,所以我们只是去寻找它。所以它会像这样工作......
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellWithIdentifier = @"Cell";
BaseLabel *_currentSetting;
UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellWithIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellWithIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
// new cell, so add a label
_currentSetting = [[BaseLabel alloc] initWithFrame:CGRectMake(160, 8, 115, 25)];
[_currentSetting setFont:[UIFont systemFontOfSize:14]];
_currentSetting.backgroundColor = [UIColor clearColor];
_currentSetting.textColor = [UIColor blueColor];
_currentSetting.textAlignment = NSTextAlignmentRight;
_currentSetting.tag = 128;
[cell.contentView addSubview:_currentSetting];
} else {
// existing cell so find the label
_currentSetting = (BaseLabel *)[cell viewWithTag:128];
}
问题2:现在我们准备好了一个单元格和标签子视图的句柄,它应该如何配置?唯一合理的方法是根据indexPath查看我们的模型。
在没有理解模型的情况下,我无能为力,但通用的想法是:
// say my model is an array of N arrays, one for each section, I would do this
NSArray *sectionModel = [self.mainModel objectAtIndex:indexPath.section];
id *modelElement = [sectionModel objectAtIndex:indexPath.row];
// now configure the cell based on modelElement
_currentSetting.text = [modelElement someStringAttributeOfMyModel];
return cell;
}
答案 2 :(得分:1)
我可以忽略viewWillAppear
中的viewDidAppear
来电,这很奇怪,但有趣的是你根本不使用indexPath
参数。
由于此参数是如何检查生成的单元格的唯一方法,因此几乎可以获得任何结果,并且可以随机排序单元格。 reloadData
只会再次洗牌。
由于rowcount
仅增加,很快您的cell.tag ==
比较都不会评估为真。
顺便说一句,代码是将子视图添加到已经存在的单元格中 - 这意味着在多次重新加载或滚动之后,您的单元格将有许多标签。为什么将添加到单元格中的最后一个标签保存到实例变量中,更改文本然后将其移动到另一个单元格...这是个谜。
您的代码没有任何意义!