【问题标题】:why is beginUpdates not resizing my cell in UITableView?为什么 beginUpdates 没有在 UITableView 中调整我的单元格的大小?
【发布时间】:2012-09-06 01:40:18
【问题描述】:

我有什么:

一个带有单元格的 UITableView。这个单元格有一个 UITextView 作为子视图。所有委托和数据源均已正确设置。单元格高度是从 heightForRow 等正确获取的。用户在 textView 中输入文本。

我正在尝试做的事情:

我希望单元格在用户键入时更新其高度,而无需将 textView 作为第一响应者。 stackOverflow 上的许多帖子都说空的 beginUpdates/endUpdates 适用于此。

我尝试了什么:

1- 我在 textViewDidChange 中调用了 beginUpdates 和 endUpdates(针对 tableView)。没啥事儿。 (注意:所有的代表都设置正确)。

2- 我什至在 textViewDidEndEditing 中调用了 beginUpdates 和 endUpdates 以确保(以查看它在 textView 辞去第一响应者后是否有效)。它可以工作(当 textView 辞去 firstResponder 时,单元格会调整大小)。

3- 然后我在 textViewDidChange 中尝试了 reloadData。它可以工作,除了它将 textView 作为第一响应者(键盘在每个键入的字符上消失)。

4- 然后我尝试了 reloadData,然后直接告诉 textView 再次成为FirstResponder(以保持键盘向上)。它可以工作,但这会导致 textView 中的光标位置、自动更正和退格出现许多问题。

5- 然后我尝试了 reloadData,然后当我希望键盘保持向上时在 textViewShouldEndEditing 中返回 NO,但由于某种原因,单元格不会更新其高度。

6- 最后,我尝试了 reloadRowsAtIndexPaths 等,然后在 textViewShouldEndEditing 中返回 NO,但它给了我一个错误,说它无法删除拒绝 resignFirstResponder 的对象。

我还尝试了 textViewDidChange 中的 reloadInputViews 和 setNeedsDisplay 和 setNeedsLayout 等方法,但没有任何反应。

我的问题:

在我看来,#2 表明一个单元格不能更新它的高度,而它的一个子视图是 firstResponder。是这样吗?有这方面的任何文件(我找不到任何文件)?

为什么 beginUpdates/EndUpdates 不起作用?是否存在不起作用的已知或常见情况?我设置的方式可能有问题吗?但是调整大小与#3 和#4 完美配合(表明我所有的委托方法等都设置正确)。

很抱歉这个很长的问题,但是除了我发布的那些之外,任何人都可以提供任何想法吗?我有一种感觉,我错过了一些非常愚蠢和明显的事情(像往常一样)......

顺便说一句,我正在使用 iOS 模拟器和带有 5.1 的实际 iPhone

【问题讨论】:

  • this 链接基本上告诉 UITableView 不支持实时调整单元格大小(因为用户在作为单元格子视图的 textView 中键入)。我应该尝试使用 UIScrollView 还是有人知道在 UITableView 中执行此操作的方法?
  • 你在 cellHeightForRowAtIndexPath: 表视图委托方法中指定了新的高度,你实现了那个方法吗?
  • 是的,我确实实现了该方法,#3 和 #4 显示该方法工作正常...

标签: ios uitableview uitextview reloaddata


【解决方案1】:

它在我的小演示应用程序中完美运行。请注意,代码获取 textView 委托消息,设置应用于每个单元格的 ivar 高度,然后调用 begin/end - 每个字符按下时单元格都会变大:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Asked for Height");
    return height;
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
    NSLog(@"Text");
    height += 10;
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
    return YES;
}

【讨论】:

  • 这真的是最奇怪的事情......你的代码运行良好,我制作了自己的演示应用程序来尝试它并且它运行正常!
  • 我当前的应用程序一定有问题...看来我需要重写一些部分或从头开始重做。无论如何,感谢您证明 beginUpdates 有效!问题出在我的应用程序上……
  • 你知道除了 tableView 和 textView 和 tableView 数据源的委托之外我应该检查什么吗?
  • 我刚刚找到了它不起作用的真正原因。由于某种原因,从 textView 获得的用于计算高度的文本没有被更新。非常抱歉这个不必要的帖子。我应该仔细检查我的工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
相关资源
最近更新 更多