停止调用 cellForRowAtIndexPath

Posted

技术标签:

【中文标题】停止调用 cellForRowAtIndexPath【英文标题】:Stop cellForRowAtIndexPath from being called 【发布时间】:2015-07-29 20:56:25 【问题描述】:

我的应用程序中有一个表格视图,其中每个单元格仅包含一个文本视图。这些文本视图由存储在 NSUserDefaults 中的文本填充。用户可以更改文本,然后再次保存。来自 NSUserDefaults 的文本数组(用于填充文本视图的文本)在 viewDidLoad 处加载。但是,单元格中文本视图的文本设置在cellForRowAtIndexPath 中。问题是当用户滚动 tableview 时会调用 cellForRowAtIndexPath,因此如果他/她正在编辑其中一个 textViews 并在打字时滚动,一切都会消失,因为调用了 cellForRowAtIndexPath,并且 textViews 文本是从保存的在viewDidLoad 上加载的数据。

所以..我想也许让cellForRowAtIndexPath 只更改一次textviews 的文本(在应用程序启动时)会解决问题,但事实证明cellForRowAtIndexPath 是为每个单元格单独调用的。所以它工作但只加载了第一个单元格的 textView 的文本,因为我只让 cellForRowAtIndexPath 这样做一次。

我的问题是:我怎样才能让cellForRowAtIndexPath 仅在调用 viewDidLoad 时更改所有单元格的 textView 文本?或者我可以通过viewDidLoad 方法为每个单元格设置 textView 的文本吗?因为这显然可以解决问题。

【问题讨论】:

我不确定您是否完全理解 UITableView 的工作原理。 -cellForRowAtIndexPath 应该在每次表格需要新单元格时调用(这在您滚动时很常见)。另外,你确定-cellForRowAtIndexPath 是在-viewDidLoad 之前被调用的吗?这听起来不对。 没错,我测试过了,viewDidLoad-cellForRowAtIndexPath 之前被调用。有什么建议可以解决这个问题吗? 您需要以某种方式将更改的数据保存在您的UITableViewCell 中。您可以将它放在一个数组中并将其存储在内存中,或者如果您需要将其保存下来以供以后的会话使用,您可以将其保存到 CoreData。关于viewDidLoad,我建议你查看苹果提供的视图生命周期文档。 【参考方案1】:

每当用户在您的一个单元格中更改文本视图中的文本时 - 立即将该文本保存到您的 textArray。现在,如果用户滚动离开,然后返回到该单元格 - 该单元格将包含更新后的文本。然后当用户在此屏幕中完成文本编辑后,将所有更改保存到 NSUserDefaults(例如,您可以将其保存在 viewWillDisappear 中)。

【讨论】:

以上是关于停止调用 cellForRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

ajax调用后如何停止刷新页面?

QWidget paintEvent 无故停止调用

didUpdateToLocation 停止调用

在 setInterval 中调用 clearInterval() 不会停止 setinterval

如何正确停止线程

API 调用完成后显示 CircularProgressIndicator() 不会停止