获取 UITableViewCell 的子视图(UITextField 或 UILabel)——两种方式,一种有效,一种无效——为啥?

Posted

技术标签:

【中文标题】获取 UITableViewCell 的子视图(UITextField 或 UILabel)——两种方式,一种有效,一种无效——为啥?【英文标题】:Get subview (UITextField or UILabel) of UITableViewCell -- two ways, one works, one doesn't - why?获取 UITableViewCell 的子视图(UITextField 或 UILabel)——两种方式,一种有效,一种无效——为什么? 【发布时间】:2013-09-18 18:09:46 【问题描述】:

我有一个通过包含UITextFieldUILabel 的情节提要设计的UITableViewCell。我想在调用cellForRowAtIndexPath 时更新这些视图的值。

我首先尝试像这样获取对文本字段和标签的引用:

UITextField *textfield = (UITextField*)[cell.contentView viewWithTag:10];
UILabel *label = (UILabel*)[cell.contentView viewWithTag:20];

这适用于 UILabel,但我只能在第一次创建单元格时获得对 UITextField 的引用,我能够设置原始值 (textField.text) 但从未更新它。如果我检查子视图数组,我可以看到UITextField 在那里,我只是无法使用viewWithTag 来处理它。我切换到这个(下),它的工作原理:

UITextField* textField = [[cell.contentView subviews] objectAtIndex:0];
UILabel *label = [[cell.contentView subviews] objectAtIndex:1];

为什么第一种方法不起作用?这样做的正确方法是什么?

这段代码的上下文是:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"DetailCell" forIndexPath:indexPath];
  UITextField* textField = [[cell.contentView subviews] objectAtIndex:0];
  textField.text = @"<something>";
  UILabel *label = [[cell.contentView subviews] objectAtIndex:1];
  label.text = @"<something else>";
  return cell;

【问题讨论】:

您的代码未显示您在视图上设置标签的位置。还有你想要达到的目标是什么?您何时需要访问这些字段?在输入它们之后或在按下保存按钮或其他什么之后立即?有更好的方法来做到这一点。 @Rog 使用其中一个检查器在 Storyboard 中设置标签值。我有一个带有单元格的表格,单元格有文本字段。当用户在其中一个文本字段中输入值时,我想更新其他单元格中文本字段的值以反映这一点。 您意识到cellForRowAtIndexPath 仅在创建单元格或系统需要使单元格出列(即滚动表格视图)时调用?从您的描述来看,您只有一个或少数几个单元格,因此为什么您无法通过该方法更新文本字段,因为它再也不会被调用。您应该改为实现 textFieldDidEndEditing 委托方法并从那里获取/更新您的文本字段。 我使用textFieldDidEndEditing 检测到文本字段中的值已更改,然后我更新数据源(它具有所有文本字段的值)并告诉表刷新。在刷新期间,我希望 cellForRowAtIndexPath 被调用并且我可以在其中更新文本字段的值。我想我以某种方式失去了标签的价值,我有一个想法要检查!感谢您的 cmets! 【参考方案1】:

对不起。这只是我的一个错误,我很抱歉浪费你的时间。我覆盖了在 Storyboard UI 中设置的 textField.tag 的值。 (我认为它是 Storyboard 中设置的值,但事实并非如此)。原始代码运行正常。仍然不确定哪种方法更好。假设特定索引或特定标签值更安全吗?这些对我来说似乎都不安全。

【讨论】:

以上是关于获取 UITableViewCell 的子视图(UITextField 或 UILabel)——两种方式,一种有效,一种无效——为啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取uibutton(UITableViewCell的子视图)相对于整个窗口iOS Objective-C的位置?

无法获取 UITableViewCell 的索引路径

为啥我必须删除为 UITableViewCell 添加的子视图,而不是在 UITableViewCell 的子类中?

将大于 cellHeight 的子视图添加到 UITableViewCell?

UITableViewCell 的子视图不能是圆形的

将 UITableViewCell 的子视图放在最前面