我有一个继承的UITableViewCell类,我从中创建一个包含UITextField的自定义单元格。
默认情况下,UITextField的高度为25像素。
我想要的行为是,当用户点击textField时,UITextField应该更改为100像素高度,并且单元格应该相应增长。
我可以通过通知和观察者检测UITextField何时获得焦点,但我想知道如何以编程方式使该tableView:HeightForCellAtindexPath:被调用。
答案 0 :(得分:2)
与Endemic一样,tableView:heightForCellAtIndexPath:
是您需要实施的方法。根据Apple的说法,触发调整大小的最有效方法是空beginUpdates
/ endUpdates
块,就像这样。
[tableView beginUpdates];
[tableView endUpdates];
它可以节省您重新加载单元格内容的开销,而且我相信,它可以为您提供一个不会从reloadData
获得的精彩动画。
答案 1 :(得分:1)
只要表视图加载数据,就会调用tableView:heightForCellAtIndexPath:
方法,因此只需在表视图上调用reloadData
(或其他一种更具选择性的重载方法)就可以正常工作。
答案 2 :(得分:1)
您必须在单元格和表格视图控制器之间建立链接。由于您已经在控制器中创建自定义单元格,因此最简单的方法是使用委托模式。
@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
的特殊高度。
您可能必须包含另一个委托方法,以了解焦点何时离开文本字段。
另一种方法是使用通知,但这只会使您的代码复杂化,如果只有一个消息接收者,则委托是首选方式。第三种方法是将文本字段的委托设置为控制器而不是单元格。
最重要的是,你需要提供单元格和表格之间的链接查看你自己,我相信使用委托模式是最好的方法。