更新UITableView上单元格中的子视图

时间:2013-03-11 10:46:06

标签: objective-c xcode ipad uitableview

我正在使用Storyboard在iPad 6.0中开发一个应用程序。

首先让我解释一下我的目标。我正在尝试使用2个UITableViewControllers来实现Master-Detail(类似SplitViewController)的View Controller。

第一个UITableView(“Master”),让我们称之为 HeaderTableView ,正如其名称所暗示的那样,列出了...的标题。

...第二个UITableView(“详细信息”),我们称之为 EncodingTableView ,其中包含一个以编程方式更改的CustomTableViewCell(每个单元格中包含的子视图可能是UITextField,UIButton或UISwitch)。 / p>

参见 EncodingTableView.m

- (void)updateEncodingFields:(NSArray *)uiViewList
{
    // Add logic for determining the kind of UIView to display in self.tableView

    // Finally, notify that a change in data has been made (not working)
    [self.tableView reloadData];
}
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
        {
            NSString *encodingFieldsTableId = @"encodingFieldsTableId";

            CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:encodingFieldsTableId];

            if (cell == nil) {
                cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:encodingFieldsTableId];
            }
            // Change text in textView property of CustomTableViewCell
            cell.encodingFieldTitle.text = uiViewList.title;
            // added methods for determining what are to be added to [cell.contentView addSubView:]
            // data used here is from the array in updateEncodingFields:

        }

我的 HeaderTableView.m ,包含didSelectRowAtIndexPath以更新 EncodingTableView

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
            if (![selectedIndexPath isEqual:indexPath]) {
                selectedIndexPath = indexPath;
                [self updateDataFieldTableViewForIndexPath:indexPath];
            }
        }

    - (void)updateDataFieldTableViewForIndexPath:(NSIndexPath *)indexPath {
        [self.encodingTableView updateEncodingFields:self.uiViewList];
    }


问题   - 数据都可以,但为什么 EncodingTableView “重绘”字段?我的    怀疑是重复使用细胞与此有关,但我无法弄清楚原因。

结果屏幕截图:

HeaderTableView中的初始选择 Initial Selection

HeaderTableView中的第二个选择 Second Selection

我尝试了什么:

  • 我不断看到诸如[UITableView setNeedsDisplay]之类的建议, [UITableView reloadData]和[UITableView setNeedsLayout]但没有 他们工作了。
  • 删除tableViewCells的重用工作正常,但这会导致我的部分内容 CustomTableView.encodingFieldTitle消失。更不用说如果我放弃重复使用单元格,这可能会导致性能问题。

限制: 我知道一个好主意是使用SplitViewController,但这只是我的应用程序的子部分(因此不是RootViewController)。

最后,感谢阅读这么长的帖子。 ;)

3 个答案:

答案 0 :(得分:5)

看起来您最有可能在tableView:cellForRowAtIndexPath:内添加子视图。

问题是如果你使用单元格重用,那么并不总是从tableView:cellForRowAtIndexPath:内的空白平板开始,而是可以给你一个已经配置一次的单元格。这就是您所看到的,之前添加了标签的单元格将被传回给您,然后您在顶部添加更多标签。

有几种方法可以解决这个问题:

  1. (我的首选选项)创建UITableViewCell的子视图,并将这些额外的子视图作为属性提供。

  2. 确保单元设置仅执行一次 这样做的好地方是当你实际创建一个单元格时,例如在if (cell)支票

    if (cell == nil) {
      cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:encodingFieldsTableId];
    
      // add subview's here and give them some way to be referenced later
      // one way of doing it is with the tag property (YUK)
      UILabel *subView = [[UILabel alloc] initWithframe:someFrame];
      subView.tag = 1;
      [cell.contentView addSubview:subView];
    }
    
    UILabel *label = (id)[cell.contentView viewWithTag:1];
    label.text = @"some value";
    

答案 1 :(得分:2)

我在代码中看到的一个问题是tableView cellForRowAtIndxPath函数中使用的单元格标识符不同。

在您使用此标识符出列时 - > " encodingFieldsTableId"

&安培;

创建正在使用此标识符的单元格时

- > " dataFieldUiGroupTableId"

理想情况下,这两个标识符应该相同!!!

答案 2 :(得分:1)

尝试添加,

cell.encodingFieldTitle.text = nil;

if(cell == nil)之前

因此,无论何时调用cellForRowAtIndexPath方法,您要重复使用的单元格中已存在的字符串都将被删除,并且uiViewList.title中的新文本将会显示。