0

我有一个 4 行的分组表视图。我对如何在两个视图之间做事进行了相当大的改革,现在 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 上,但单元格没有改变它们的标签。为什么?

4

3 回答 3

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;
}
于 2013-02-01T20:59:14.647 回答
3

我在这里看到的主要问题是:

cell.tag = rowcount;
rowcount++;

cell.tag 不能出现在if (cell == nil)里面,你应该把它拿出来。相反,您根本不应该检查 cell.tag 来设置 currentSettingText,而应该使用 indexPath.row

同样在每个 viewDidAppear 中,当您重新加载表格时,都会调用 cellForRowAtIndexPath,这会增加 rowCount 并因此每次增加 cell.tag,您在哪里重置它?

于 2013-02-01T20:47:34.790 回答
1

我可以忽略非常奇怪的viewWillAppear调用,viewDidAppear但有趣的是您根本没有indexPath在方法中使用参数。由于此参数是检查您正在生成的单元格的唯一方法,因此您几乎可以获得任何结果,并且单元格可以随机排序。AreloadData将再次洗牌。

随着rowcount唯一的增加,很快你的cell.tag ==比较都不会评估为真。

顺便说一句,代码正在向已经存在的单元格添加子视图——这意味着在几次重新加载或滚动之后,您的单元格将有很多标签。为什么要将添加到单元格的最后一个标签保存到实例变量中,将其更改为文本,然后将其移动到另一个单元格……这是一个谜。

你的代码没有任何意义!

于 2013-02-01T20:49:46.617 回答