1、在tableviewcell拖一个UITextView,设置上下左右的约束;
2、记得再给UITextView设置一个大于等于的高度,必须大于0;(注意:因为UITextView顶部有个UILabel和UIButton,而我的UITextView顶部是依据UILabel的底部为约束,所以UILabel要添加一个固定高度的约束)
3、记得把UITextView的Scrolling Enabled设置为false。就是取消勾选(这一点很关键,如果不设置为 NO,UITextView 在内容超出 frame 后,重新设置 text view 的高度会失效,并出现滚动条。)
4、在控制器设置UITableView的默认高度和cell的高度使用自适应高度
// 支持自适应 cell
self.tableView.estimatedRowHeight = 100;
self.tableView.rowHeight = UITableViewAutomaticDimension;
5、在UITableViewCell上面,将UITextView的delegat 对象设置为cell上面;
在UITextViewDelegate下面的方法加上刷新的代码
- (void)textViewDidChange:(UITextView *)textView
{
CGRect bounds = textView.bounds;
// 计算 text view 的高度
CGSize maxSize = CGSizeMake(bounds.size.width, CGFLOAT_MAX);
CGSize newSize = [textView sizeThatFits:maxSize];
bounds.size = newSize;
textView.bounds = bounds;
// 让 table view 重新计算高度
UITableView *tableView = [self tableView];
// 让 table view 的高度进行刷新,必须要调用以下两个方法
[tableView beginUpdates];
[tableView endUpdates];
}
- (UITableView *)tableView
{
UIView *tableView = self.superview;
while (![tableView isKindOfClass:[UITableView class]] && tableView) {
tableView = tableView.superview;
}
return (UITableView *)tableView;
}
6、因为tableview滚动的时候的重用机制,会把之前输入的内容给情况,所以在输入的内容的时候,需要把内容给存起来。不会导致内容丢失的情况
7、在UITableviewCell中添加一个委托
@protocol TextViewCellDelegate;
@interface TextViewCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UITextView *textView;
@property (weak, nonatomic) id
@end
@protocol TextViewCellDelegate
- (void)textViewCell:(TextViewCell *)cell didChangeText:(NSString *)text;
@end
8、然后在UITextView的delegate的textViewDidChange中把内容委托出去,让外部进行存储操作
- (void)textViewDidChange:(UITextView *)textView
{
if ([self.delegate respondsToSelector:@selector(textViewCell:didChangeText:)]) {
[self.delegate textViewCell:self didChangeText:textView.text];
}
// 计算 text view 的高度
...
// 让 table view 重新计算高度
...
}
9、最后在视图控制器类进行数据的存储
#pragma mark - TextViewCellDelegate
- (void)textViewCell:(TextViewCell *)cell didChangeText:(NSString *)text
{
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
NSMutableArray *data = [self.data mutableCopy];
data[indexPath.row] = text;
self.data = [data copy];
}
#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.data count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
TextViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TextViewCell" forIndexPath:indexPath];
cell.textView.text = self.data[indexPath.row];
return cell;
}