1

我正在使用 Storyboards 在 iPad 6.0 中开发应用程序。

让我先解释一下我的目标。我正在尝试使用 2 个 UITableViewControllers 实现主细节(SplitViewController-like)视图控制器。

第一个 UITableView("Master"),我们称之为HeaderTableView,顾名思义,列出了...

...第二个 UITableView("Detail"),我们称之为EncodingTableView,它包含一个以编程方式更改的 CustomTableViewCell(每个单元格中包含的子视图可能是 UITextField、UIButton 或 UISwitch)。

请参阅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 中的初始选择 初始选择

HeaderTableView 中的第二个选择 第二次选择

我试过的:

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

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

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

4

3 回答 3

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";
    
于 2013-03-11T11:46:22.440 回答
2

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

出队时,您正在使用此标识符 - >“encodingFieldsTableId”

&

在创建单元格时,您正在使用此标识符 - >“dataFieldUiGroupTableId”。

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

于 2013-03-11T11:02:52.637 回答
1

尝试添加,

cell.encodingFieldTitle.text = nil;

if(cell == nil)

因此,每当cellForRowAtIndexPath调用您的方法时,您要重用的单元格中已经存在的字符串将被删除,并且uiViewList.title将显示其中的新文本。

于 2013-09-03T12:18:58.080 回答