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

时间:2012-06-11 11:46:59

标签: ios core-data uitableview

我正在尝试实现一个表视图,它应该根据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 个答案:

答案 0 :(得分:2)

我对iOS开发并不是很有经验,但我做了很多游戏开发。您的问题的根源似乎是您的程序必须呈现的动画量。既然你说你对这个程序的动机是保留了很酷的效果,那么你应该改变一切可能的程序来优化你的程序,直到用户可以感知到这一点。我知道这不是很清楚,所以这是一个可能的解决方案:

对于用户可以移动滑块的每个速度,您不应该为每一行添加动画。相反,只需要为您的体验提供尽可能多的动画,让体验变得流畅。这可以通过计算滑块更改速率,然后在调用reloadData之前调整向表中添加的行数来实现。仅动画添加循环中的最后一行。

因为我不知道你正在开发什么系统或者真的关于各种iOS平台的图形功能,我不能真正给你特定的价值,但是你应该玩不同的设置和看看有什么用。