根据滑块值重新加载 UITableView 数据

Posted

技术标签:

【中文标题】根据滑块值重新加载 UITableView 数据【英文标题】:Reloading UITableView data according to slider value 【发布时间】:2012-06-11 11:46:58 【问题描述】:

我正在尝试实现一个表格视图,它应该根据 UISlider 的值显示单元格。

示例:表格是空的。用户快速将滑块拖动到 400 的值。现在表格应该包含 400 行。

单元格应显示的数据存储在核心数据中,大约有 400 个条目。我们试图在拖动滑块时获得一种很酷的效果,这样您就可以直观地看到每个被添加的单元格(当然,如果您正在查看单元格最终所在的表格视图部分)。使用 - (void) reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation 时提供的内置动画就足够了,而且在 1 到 10 行之间的效果看起来很酷。

问题:值达到 10 或更多后,它开始滞后太多而无法工作。我认为这是因为 reloadSections: 每次滑块更改值时都必须检查每个单元格,我浪费了太多宝贵的时间。

所以,我正在寻找有关如何实现这一点的想法。我是否应该使用 NSFetchedResultsController 并在每次滑块更改值时更改获取请求(每秒可能发生 20 次)?我是否应该将所有数据加载到一个数组中并以标准方式重用单元格?

两种方法我都试过了,延迟几乎一样。我在想问题可能是 reloadSection: 太慢了。我认为- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 会是一个更好的选择,但我正在寻找更多关于如何实现它的想法。

任何帮助将不胜感激!

我在滑块改变值时测试的最后一段代码:

- (IBAction) sliderChangedValue:(UISlider *)slider

    // Make sure we only run this function on integer changes. It fires too often on float changes.
    if ((int)slider.value == lastSliderIntegerValue) 
        return;
    

    if (slider.value > lastSliderIntegerValue) 

        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(int)slider.value inSection:0]] 
                              withRowAnimation:UITableViewRowAnimationAutomatic];
    

    else 
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(int)slider.value inSection:0]]
                              withRowAnimation:UITableViewRowAnimationAutomatic];
    

    lastSliderIntegerValue = (int)slider.value;

【问题讨论】:

能否包含您当前使用的代码以响应滑块的变化?您在寻找什么视觉效果 - 表格是否还会继续向下滚动以显示添加的新行? 我已经包含了当前代码,但我之前尝试了更多方法。表格不会向下滚动所有新行,但它会闪烁滚动指示器,这很好,因为它会节省一些性能。上面的效果就够了。当直接从核心数据加载时,一些行被添加到顶部,一些被添加到中间,等等。这使得效果一直很酷。但它并未反映在当前代码中。感谢您抽出宝贵时间提供帮助! 【参考方案1】:

我在 ios 开发方面的经验并不丰富,但我做过很多游戏开发。您的问题的根源似乎是您的程序必须渲染的动画量。既然你说你开发这个程序的动机是保持酷炫的效果,那么你应该尽可能地改变你的程序来优化你的程序,直到用户可以感知到的程度。我知道这不是很清楚,所以这是一个可能的解决方案:

您不应该为用户可以移动滑块的每种速度添加每一行的动画。相反,只需为体验流畅所需的数量设置动画即可。这可以通过计算滑块更改的速率来完成,然后在调用 reloadData 之前调整向表中添加的行数。仅对循环中最后一行的添加进行动画处理。

因为我不知道您正在开发什么系统,或者根本不知道各种 iOS 平台的图形功能,所以我不能真正给您具体的值,但您应该尝试不同的设置和看看什么有效。

【讨论】:

是的,我不得不接受这样的事情。感谢您的回答

以上是关于根据滑块值重新加载 UITableView 数据的主要内容,如果未能解决你的问题,请参考以下文章

滑块值更改时快速更新表格中的单元格数

非线性 ui 滑块值/占位符

UIPageViewController 强制重新加载 ChildView 控制器

我的用户默认值没有保存我的滑块值 - Swift 3

在 UITableView 的自定义单元格中使用滑块

WPF - 将滑块值数据绑定到 StoryBoard?