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

Objective c 更新UITableView上单元格中的子视图,objective-c,xcode,ipad,uitableview,Objective C,Xcode,Ipad,Uitableview,我正在使用故事板在iPad6.0中开发一个应用程序 让我先解释一下我的目标。我正在尝试使用2个UITableViewController实现主细节拆分ViewController,类似于视图控制器 第一个UITableViewMaster,我们称之为HeaderTableView,顾名思义,它列出了 …第二个UITableViewDetail,我们将其称为EncodingTableView,它包含一个以编程方式更改的CustomTableViewCell子视图,每个单元格中包含的子视图可以是UI

我正在使用故事板在iPad6.0中开发一个应用程序

让我先解释一下我的目标。我正在尝试使用2个UITableViewController实现主细节拆分ViewController,类似于视图控制器

第一个UITableViewMaster,我们称之为HeaderTableView,顾名思义,它列出了

…第二个UITableViewDetail,我们将其称为EncodingTableView,它包含一个以编程方式更改的CustomTableViewCell子视图,每个单元格中包含的子视图可以是UITextField、UIButton或UISwitch

参见EncodingTableView.m

My HeaderTableView.m,包含用于更新EncodingTableView的didSelectRowAtIndexPath

问题: -数据一切正常,但为什么EncodingTableView不重新绘制字段?我的 怀疑是重复使用细胞与此有关,但我就是不明白为什么

结果截图: HeaderTableView中的初始选择

HeaderTableView中的第二个选择

我所尝试的:

我一直看到一些建议,如[UITableView setNeedsDisplay], [UITableView重载数据]和[UITableView设置需要Slayout],但没有 他们成功了。 删除tableViewCells的重用工作正常,但这会导致部分问题 CustomTableView.encodingFieldTitle将消失。更不用说,如果我放弃重用单元,这可能会导致性能问题。 限制: 我知道使用SplitViewController是个好主意,但这只是我应用程序的一个子部分,因此不是RootViewController


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

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

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

&

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


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

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

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

&

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


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

看起来您很可能正在tableView:cellForRowAtIndexPath:中添加子视图

问题是,如果您使用单元重用,那么您并不总是从tableView:cellForRowAtIndexPath:中的空白板开始,相反,您可能会得到一个已经配置过一次的单元。这就是您看到的,以前添加了标签的单元格将返回给您,然后在顶部添加更多标签

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

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

确保单元格设置仅完成一次 这样做的一个好地方是,当一个单元格不存在时,实际上创建一个单元格,例如在if单元格检查中


看起来您很可能正在tableView:cellForRowAtIndexPath:中添加子视图

问题是,如果您使用单元重用,那么您并不总是从tableView:cellForRowAtIndexPath:中的空白板开始,相反,您可能会得到一个已经配置过一次的单元。这就是您看到的,以前添加了标签的单元格将返回给您,然后在顶部添加更多标签

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

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

确保单元格设置仅完成一次 这样做的一个好地方是,当一个单元格不存在时,实际上创建一个单元格,例如在if单元格检查中

试着加上

cell.encodingFieldTitle.text = nil;
前ifcell==nil

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

尝试添加

cell.encodingFieldTitle.text = nil;
前ifcell==nil


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

请在不注释任何内容的情况下显示整个CellForRowatineXpath:方法。这是调试所有单元格不重画问题的唯一相关方法。请不要使用“出列”重新使用单元格,然后重试。@dasblinkenlight与此相关的cellForRowAtIndexPath的剩余部分是添加子视图:[cell.contentView addSubview:fieldView]@SaurabhSingh正如我尝试的部分中提到的,我确实删除了单元格的出列重用,但这会导致CustomTableViewCell的部分消失。经过调试,我发现
如果单元格的视图不正确,请在不注释任何内容的情况下显示整个CellForRowatineXpath:方法。这是调试所有单元格不重画问题的唯一相关方法。请不要使用“出列”重新使用单元格,然后重试。@dasblinkenlight与此相关的cellForRowAtIndexPath的剩余部分是添加子视图:[cell.contentView addSubview:fieldView]@SaurabhSingh正如我尝试的部分中提到的,我确实删除了单元格的出列重用,但这会导致CustomTableViewCell的部分消失。调试后,我发现单元格的视图很抱歉,这只是一个输入错误。更新了我上面的答案。谢谢你的快速观察!对不起,那只是个打字错误。更新了我上面的答案。谢谢你的快速观察!谢谢你。我已经尝试了选项2,但奇怪的是,当我想更改标签文本时,我无法访问id[cell.contentView viewWithTag:1]。让我试一下选项1。谢谢。我已经尝试了选项2,但奇怪的是,当我想更改标签文本时,我无法访问id[cell.contentView viewWithTag:1]。让我试一下选项1。
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";
cell.encodingFieldTitle.text = nil;