将FirstResponder 重新分配给不再出现在屏幕上的UITableViewCell 上的UITextView

发布于 2024-10-17 13:50:40 字数 576 浏览 9 评论 0原文

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

我遇到的问题是,如果用户触摸 UITextView,它将成为第一个响应者并且键盘会弹出。如果用户随后向下滚动到第一个Responder 所在的 UITableViewCell 不再出现在屏幕上的位置,我将无法访问 UITextView 来关闭它。

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

另一个奇怪的事情是,如果我将 UITextField 滚动到屏幕之外,键盘仍然可以用于写入它,并且当我滚动回 UITextField 时,键入的文本是可见的代码>.

任何帮助将不胜感激。

I have a UITableView with a whole bunch of custom UITableViewCells in it. Each of these UITableViewCells has a UITextView in them.

The problem I'm having, is that if the user touches a UITextView, that becomes the firstResponder and the keyboard pops up. If the user then scrolls down to a point where the UITableViewCell that the firstResponder is on is no longer on the screen, I can't get at the UITextView to dismiss it.

I've tried holding (and retaining) a reference to the UITextView, but as soon as it leaves the screen and I try to access it I get an EXC_BAD_ACCESS. This happens no matter how many times I retain it, so I suspect it may be having dealloc called directly on it (I'm not sure how the cell dequeueing system actually works).

The other weird thing is that if I scroll the UITextField off screen, the keyboard can still be used to write to it, and the text typed is visible when I scroll back to the UITextField.

Any help would be much appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

‖放下 2024-10-24 13:50:40

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 文件中的自定义单元格的标识符字段设置为 CustomCell。一旦我的单元格被正确地重新使用,UITextField 在其时间之前被释放的问题就消失了。

Fluchtpunkt was absolutely correct, I wasn't re-using my cells correctly. My problem was that I was loading my custom UITableViewCells from a nib using the method:

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];
}

I didn't realize that I had to set the Identifier field in the .xib file for the custom cell to CustomCell. As soon as my cells were being re-used properly, the problem with the UITextField being dealloc'd before its time disappeared.

蝶…霜飞 2024-10-24 13:50:40

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

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

You can save the indexPath of the cell that user is editing. Then when he scrolls test if that cell is in visible cells of the tableView. If not get the text field from that cell and dismiss the keyboard.

UITableViewCell *editingCell =  [self.tableView cellForRowAtIndexPath:SavedIndexPath];
[editingCell.textField resignFirstResponder];
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文