告诉 UITableView 在不可见时不要释放单元格

Posted

技术标签:

【中文标题】告诉 UITableView 在不可见时不要释放单元格【英文标题】:Tell UITableView to not release cell when not visible 【发布时间】:2012-04-12 15:34:38 【问题描述】:

有没有什么方法可以告诉 UITableView 在单元格变得不可见时释放单元格?

我问这个是因为我有这个问题: 我有一个 UITableView 用作“插入视图”。在单元格内,我有许多 UITextView。当我推送 UITableView 时,我将“becomeFirstResponder”发送到第一个单元格,以在打开键盘的情况下启动视图。这可以正常工作。

但是,如果我向下滚动,当第一个单元格变得不可见时,键盘会自行关闭。 注意:关联的 UITextView 是一个属性 retain 并且它正确地保持分配状态,只是单元格消失并且 UITextView 似乎放弃了第一响应者。

我知道我可以检查 UITextView 何时恢复可见并发送另一个 becomeFirstResponder,但我想知道我是否可以通过第一个请求达到我的目标 :-)

谢谢 问候 法比奥

【问题讨论】:

您可能希望在打开软键盘时锁定滚动。移动设备的内存有限。从技术上讲,他们不可能让细胞远离屏幕。如果您确实设法保留它们,您的应用程序将因过度使用内存而被终止。 同意@HeShiming。此外,您的用户可能不想在他们看不到的字段中输入文本。 @HeShiming 我们正在谈论“插入视图”,单元格的数量是有限的:-) 显然我必须注意内存,但我已经这样做了(在此不使用 ARC APP)...我对内存非常小心:-D。考虑在不可见的文本视图中写入内容来锁定滚动的好主意:-D 谢谢 【参考方案1】:

在单元格中使用 tableview 通常它不会释放单元格。第一次它会分配一些可见的单元格,第一次出现时间表,之后它使用相同的单元格意味着在不同的 indexpath 的不同日期重用相同的单元格,你应该使用 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

【讨论】:

不,我删除了它。 UITableview 不会将单元格出列以进行重用,但它只是释放不可见的单元格(这是设计使然且正确的)。我在问是否有任何“魔术方法”来避免这种情况,显然仅在这种特定情况下。谢谢 在分配cell的时候你可能使用了autorelease,这会让cell被操作系统自己释放,所以不用autorelease试试【参考方案2】:

这是我发现的一些新信息:

我看到键盘只是第一次关闭。示例:视图以 UITextView 作为 firstResponder 加载。滚动,键盘将关闭。 但是,再次点击 UITextView 后,键盘会再次打开,然后永远不会关闭,即使再次滚动也是如此。

寻找理解原因,我发现了这个:

在“viewDidLoad”中我设置了第一响应者 在 cellForRowAtIndexPath 中,我将 UITextView 添加为子视图 在 ViewDidLoad 之后调用 cellForRowAtIndexPath

当 UITextView 退出第一响应者时,我看到它正在发生,因为 UITableView 正在搜索调用 CellForRowAtIndexPath 方法的特定单元格。 但是,再次点击后,只为其他单元格调用 CellForRowAtIndexPath,而不是为选定的单元格调用。似乎,如果在 UITableView 设置后将 UITextView 设置为第一响应者,则即使不可见,也会保留该单元格。

然后,我尝试在“viewDidAppear”中移动“becomefirstresponder”(在 uitableview 设置之后调用),然后神奇地解决了问题 :-) 如果内部的 UITextView 是第一响应者,则单元格不再释放。

剩下的唯一问题是:在 viewDidApper 中调用“becomeFirstResponder”会导致键盘延迟显示在屏幕上。为了避免这种情况,我在 viewDidLoad 中调用了 becomeFirstResponder,然后在 viewDidAppear 中我辞职并再次调用了 becomeFirstResponder。

希望对你有帮助

【讨论】:

以上是关于告诉 UITableView 在不可见时不要释放单元格的主要内容,如果未能解决你的问题,请参考以下文章

完全可见时在 UITableView 中播放视频

UIKeyboard 可见时如何更改 UITableView 的大小?

使表单在首次加载时不可见

当单元格不可见时,UITableView indexPathForCell 返回 null

UITableViewCell 在大型 UITableView (Xcode, iOS) 中不可见时为 nil

Swift - 当最后一行不可见时,如何对 UITableView 的最后一行执行特定操作?