获取 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 【问题描述】:我有一个通过包含UITextField
和UILabel
的情节提要设计的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 的子类中?