resignFirstResponder 到不再出现在屏幕上的 UITableViewCells 上的 UITextViews

Posted

技术标签:

【中文标题】resignFirstResponder 到不再出现在屏幕上的 UITableViewCells 上的 UITextViews【英文标题】:resignFirstResponder to UITextViews on UITableViewCells that are no longer on screen 【发布时间】:2011-02-15 07:11:15 【问题描述】:

我有一个UITableView,里面有一大堆自定义的UITableViewCells。每个UITableViewCells 中都有一个UITextView

我遇到的问题是,如果用户触摸UITextView,它将成为 firstResponder 并弹出键盘。如果用户随后向下滚动到 firstResponder 所在的 UITableViewCell 不再出现在屏幕上,我无法在 UITextView 处将其关闭。

我曾尝试持有(并保留)对UITextView 的引用,但只要它离开屏幕并尝试访问它,我就会得到EXC_BAD_ACCESS。无论我保留多少次都会发生这种情况,所以我怀疑它可能直接调用了 dealloc(我不确定单元出队系统实际上是如何工作的)。

另一件奇怪的事情是,如果我将UITextField 滚动到屏幕外,键盘仍然可以用来对其进行写入,并且当我滚动回UITextField 时,输入的文本是可见的。

任何帮助将不胜感激。

【问题讨论】:

听起来你没有正确地重复使用你的单元格 您能否提供一些关于使用自定义 UITableViewCells 的建议? 【参考方案1】:

Fluchtpunkt 是绝对正确的,我没有正确地重复使用我的细胞。我的问题是我正在使用以下方法从笔尖加载自定义 UITableViewCells:

static NSString *CellIdentifier = @"CustomCell";
ExpandingTableViewCell *cell = (ExpandingTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ExpandingTableViewCell" owner:self options:nil];
    cell = (ExpandingTableViewCell *)[nib objectAtIndex:0];

我没有意识到我必须将自定义单元格的 .xib 文件中的 Identifier 字段设置为 CustomCell。一旦我的单元格被正确地重新使用,UITextField 在其时间之前被释放的问题就消失了。

【讨论】:

【参考方案2】:

您可以保存用户正在编辑的单元格的 indexPath。然后,当他滚动测试该单元格是否在 tableView 的可见单元格中时。如果没有从该单元格中获取文本字段并关闭键盘。

UITableViewCell *editingCell =  [self.tableView cellForRowAtIndexPath:SavedIndexPath];
[editingCell.textField resignFirstResponder];

【讨论】:

试过你的方法,但似乎这种错误行为的原因是完全不同的。还是谢谢!

以上是关于resignFirstResponder 到不再出现在屏幕上的 UITableViewCells 上的 UITextViews的主要内容,如果未能解决你的问题,请参考以下文章

键盘不会随着 resignFirstResponder 消失

UITextField - resignFirstResponder 查询

没有看到 UIScrollView 上的 UITextField 时 resignFirstResponder

UISearchBar resignFirstResponder无法正常工作

无法识别的选择器发送到实例 resignFirstResponder

直接调用 UIResponder.resignFirstResponder 可以吗?