当 UITextField 获得焦点时,从 UITableViewCell 继承类中更改 UITableViewCell 的高度

Posted

技术标签:

【中文标题】当 UITextField 获得焦点时,从 UITableViewCell 继承类中更改 UITableViewCell 的高度【英文标题】:Change Height of UITableViewCell from within the UITableViewCell inherited class when UITextField receive focus 【发布时间】:2010-12-03 15:44:24 【问题描述】:

我有一个继承的 UITableViewCell 类,我从中创建一个包含 UITextField 的自定义单元格。

UITextField 默认为 25 像素高度。

我想要的行为是,当用户在 textField 中单击时,UITextField 应更改为 100 像素高度,并且单元格应相应增长。

由于通知和观察者,我可以检测到 UITextField 何时接收焦点,但我想知道如何以编程方式调用 tableView:HeightForCellAtindexPath:。

【问题讨论】:

【参考方案1】:

就像 Endemic 所说,tableView:heightForCellAtIndexPath: 是您需要实施的方法。根据 Apple 的说法,触发调整大小的最有效方法是空的 beginUpdates / endUpdates 块,就像这样。

[tableView beginUpdates];
[tableView endUpdates];

它为您节省了重新加载单元格内容的开销,并且我相信它会为您提供一个不错的动画,否则您将无法从 reloadData 获得。

【讨论】:

但是我将如何连接 UITableViewCell 继承类和那段代码中发生的事件?我可以在单元格上设置/调用的任何属性或方法会引发在 tableViewController 中触发的事件吗?【参考方案2】:

您必须在单元格和表格视图控制器之间建立链接。由于您已经在控制器中创建了自定义单元格,因此最简单的方法是使用委托模式。

@class CustomTableViewCell;

@protocol CustomTableViewCellDelegate 
- (void)customTableViewCellDidEnterTextMode:(CustomTableViewCell *)cell;
@end

@protocol (nonatomic, assign) id<CustomTableViewCellDelegate> delegate;

只需调用您正在检测文本字段何时获得焦点的委托方法

[self.delegate customTableViewCellDidEnterTextMode:self];

在控制器中

- (void)customTableViewCellDidEnterTextMode:(CustomTableViewCell *)cell 
  self.editingIndexPath = [self.tableView indexPathForCell:cell];
  // from Jablair's answer
  [tableView beginUpdates];
  [tableView endUpdates];

然后在tableView:heightForCellAtIndexPath: 中返回self.editingIndexPath 的特殊高度。

您可能还必须包含另一个委托方法才能知道焦点何时离开文本字段。

另一种方法是使用通知,但这只会使您的代码复杂化,如果只有一个消息接收者,则委托是首选方式。第三种方法是将文本字段的委托设置为您的控制器而不是您的单元格。

最重要的是,您需要自己提供单元格和表格视图之间的链接,我相信使用委托模式是最好的方法。

【讨论】:

由于同一个单元格实例用于多行,这将如何工作? 不,同一个实例一次只能用于一行。它们被重复使用,但如果屏幕上有 10 行可见,则单元格将有 10 个不同的实例。 非常感谢。我还没有尝试过,但我知道它会起作用,你最后的解释真的帮助我理解了为什么!谢谢!【参考方案3】:

每当表格视图加载数据时都会调用tableView:heightForCellAtIndexPath: 方法,因此只需在表格视图上调用reloadData(或其他更具选择性的重新加载方法之一)就可以正常工作。

【讨论】:

我在单元格内没有对 UITableView 的任何引用,因此该解决方案将迫使我在 tableView 与其单元格之间连接一个委托... yak !不过谢谢。

以上是关于当 UITextField 获得焦点时,从 UITableViewCell 继承类中更改 UITableViewCell 的高度的主要内容,如果未能解决你的问题,请参考以下文章

检测UITextField的焦点更改

UIButton没有得到关注

检测 UITextField 的焦点变化

UITextField 失去焦点事件

滚动后 UITableViewCell 标签发生变化[重复]

如何从 UITextField 中移除焦点?