添加新数据和重新加载时,UITableViewCell闪烁

时间:2016-04-18 15:34:34

标签: ios swift uitableview animation

我有一个tableview,当它显示时,每个单元格的动画都会淡入淡出。向下滚动时,我的更多数据会附加到我的数据源并重新加载我的tableview。当发生这种情况时,我的所有tableview单元格都会闪烁(已经完成动画淡入淡出动画的单元格会再次动画)。当我重新加载我的tableview时,有没有办法防止我的单元格再次动画?

//reloading datasouce

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    //configure cell


    //check to see if reloading datasource is required
        self.dataSource += additionalDataArray
        self.tableView.reloadData()


    return cell

    }


//animating cell
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        let view = cell.contentView
        view.layer.opacity = 0.1
        UIView.animateWithDuration(0.5, delay: 0, options: [.AllowUserInteraction, .CurveLinear], animations: { () -> Void in
            view.layer.opacity = 1
            }, completion: nil)
    }

1 个答案:

答案 0 :(得分:1)

永远不要在cellForRowAtIndexPath中调用reloadData()。在为每一行显示每一行之前调用此方法。调用重新加载数据时,将重新加载每一行,并为每个显示的行再次调用cellForRowAtIndexPath。在这里调用reloadData()导致循环重复地重新加载每一行。这种情况的症状是你看到的闪烁。不要在这些委托方法中调用重新加载数据。另一组方法需要监视数据源并确定何时更新。仅在更新数据时更新。

我可以看到你试图在数据到达底部时更新数据。我不知道你试图用这个解决方案克服什么问题,但记住两件事。一个是dequeueReusableCellWithIdentifier解决了具有大量数据的表的内存问题。如果您有一个包含100行的表,但一次只能看到3行,则tableview仅为3行分配内存并反复重复使用。这就是为什么即使对于已经创建的行,一遍又一遍地调用cellForRowAtIndexPath。它重新使用了一行屏幕并用新数据重新布局。其次是Swift使用指针来减少已经存在的对象的内存分配。如果您在某个数组中分配了所有100个数据对象,那么将所有100个数据对象移交给视图控制器拥有的单独数组将不会使正在使用的内存加倍。这样做是可以的。

如果你没有下一个5 avaialble,因为你需要进行另一个网络呼叫,那么你需要在willDisplayCell中使用一个方法来确定你何时接近底部。您将需要一个加载单元格来指示用户在获取更多行时等待。当你到达加载单元附近时,检查里面的isDisplayCell告诉数据源获取更多数据。返回数据后,重新加载表。永远不要重新加载cellForRowAtIndexPath。祝好运!!