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

时间:2010-12-03 15:44:24

标签: iphone cocoa-touch uitableview

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

默认情况下,UITextField的高度为25像素。

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

我可以通过通知和观察者检测UITextField何时获得焦点,但我想知道如何以编程方式使该tableView:HeightForCellAtindexPath:被调用。

3 个答案:

答案 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的特殊高度。

您可能必须包含另一个委托方法,以了解焦点何时离开文本字段。

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

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