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